我一直在努力寻找一种方法来更新 flask 网络服务器上的图表。我将图像存储在目录的静态文件中,并通过 {{url_for('static',filname=ph_plot.png) }} 访问它们,但每次我发送一个发布请求来获取新范围的数据时,图表都不会在我的网络服务器上更新,但在我的文件系统上更新。我知道每次保存文件时都可以更改文件名以使其显示,但我不知道这是否是显示动态变化照片的最佳方式。 目前我一直在 flask 中使用 send_from_directory 方法,但它也对我不起作用。下面是我的代码。 我已经为此工作了一段时间,希望得到一些帮助!谢谢
注释:all_plots.ph_plot() 正在从另一个 python 程序调用函数。 flask 代码:
@app.route('/read_ph', methods=["GET", "POST"])
def ph_plot():
if request.method == "POST":
a = request.form['read_ph']
all_plots.ph_plot(a)
time.sleep(3)
ph_plot = os.path.join(os.getcwd(), "images/ph_plot.png")
return render_template('live_stream.html', image_name=ph_plot)
@app.route('/read_ph/<ph_plot>', methods=["GET", "POST"])
def send_ph(ph_plot):
return send_from_directory("images", ph_plot)
HTML:
<html>
<body>
<h1>Data Monitoring Station</h1>
<h2>PH</h2>
<form method="POST" action="read_ph" >
<input name="read_ph" placeholder="Instances" type="text">
</form>
<a href="read_ph"><button type="button">PH Graph</button></a>
<img src="{{ url_for('send_ph',ph_plot=image_name) }}" id="plot" width ="220" height ="220">
<hr>
<h5> Return to main page <a href="/"class="button">RETURN</a></h5>
<hr>
</body>
</html>
最佳答案
send_from_directory
通常适用于实际已从用户上传到目录中的文件。这并不是你真正想要做的;你是:
- 生成绘图数据
- 创建情节并与
matplotlib
共度时光渲染它 - 将此绘图图像保存到磁盘
- 从磁盘加载该图像并将其发送给用户
消除磁盘存储的中间人:创建数据并将其直接发送到模板。这是一个使用 plotly.js
的粗略示例在单个文件中获取前端渲染的数据。您可以不断刷新页面以获得不同的图表。但请注意,每个情节都是交互式的;您可以使用右上角的菜单进行缩放,例如导出等,显示/隐藏绘图(如果有多个迹线,这将更有意义)。您无法通过渲染绘图图像获得任何这些。
from flask import Flask, render_template_string
import random
app = Flask(__name__)
# Normally you'd have this in the templates directory but for simplicity of
# putting everything into one file for an example, I'm using a template string
template = """
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<div id="plot_div" style="width: 100%; height: 100%"></div>
<script type="text/javascript">
var trace1 = {
x: {{ plot_data.x_axis }},
y: {{ plot_data.y_axis }},
type: 'scatter',
name: 'Example'
};
var layout = {
title: "Test",
titlefont: {
family: 'Poppins',
size: 18,
color: '#7f7f7f'
},
showlegend: true,
xaxis: {
title: 'Axis Unit',
},
yaxis: {
title: 'Other Axis Unit',
},
margin: {
l: 70,
r: 40,
b: 50,
t: 50,
pad: 4
}
};
var data = [trace1];
Plotly.newPlot("plot_div", data, layout);
</script>
"""
def get_plot_data():
x = list(range(10))
y = [random.randint(0, 100) for i in range(10)]
return {'x_axis': x, 'y_axis': y}
@app.route('/')
def home():
plot_data = get_plot_data()
return render_template_string(template,
plot_data=plot_data)
if __name__ == '__main__':
app.run()
这里的一个常见问题是传递日期时间字符串,因为它们会被转义。在这种情况下,您需要使用 x: {{ plot_data.x_axis | safe }}
。请参阅Passing HTML to template using Flask/Jinja2和 How to make html markup show up?
关于python - 在 Flask 中显示新图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984137/