Python 将matplotlib图形传递到HTML模板(Flask)

Python 将matplotlib图形传递到HTML模板(Flask),python,Python,下面是我生成绘图的代码部分: graph = df.plot(x='date', y='close') fig = graph.get_figure() filepath = 'static/images/graph.png' fig.savefig(filepath) return render_template('search_result.html') 我在Flask文件的顶部定义静态路径,如下所示: app=Flask(\uuuu name\uuuuu,static\u folder

下面是我生成绘图的代码部分:

graph = df.plot(x='date', y='close')
fig = graph.get_figure()
filepath = 'static/images/graph.png'
fig.savefig(filepath)

return render_template('search_result.html')
我在Flask文件的顶部定义静态路径,如下所示:

app=Flask(\uuuu name\uuuuu,static\u folder='path/to/static/folder')

以下是我的文件目录设置:

Main Folder
  - Static
    -- Images
      --- Graph.png
  - Templates
  - app.py
在我的HTML模板中,我目前正在执行以下操作:

... 但是,它只显示一个旧的图像。每次调用函数时,我都会重写图像

我理解使用jinja将变量传递到HTML,但是我不确定如何使用图像路径


有人能帮我吗?

您需要创建一个连接到Flask的send from目录调用的路由。因此,您基本上创建了一个带有
src
属性的图像到Flask路由,该路由使用
send\u from\u directory
发送图像。这是从默认静态文件夹之外的任意文件夹发送的。发送Matplotlib图像时,我会添加一个查询字符串,该字符串是图像文件的文件修改时间。有一个Python库可以从路径中获取它,您可以在下面看到一些用法。html有一个特殊功能,每次使用图像时都会强制刷新,但由于无法解释的原因,它对我不起作用,最后我使用mod time绕过浏览器缓存

首先,我使用以下参数渲染一个模板

# Acquire image modification times to use as query strings to bypass image caching.
modificationTime = os.path.getmtime( "%s/%s" % ( model.getImagesSubfolder( ) , imageFile ) )
return render_template( 'plotsPage.html' , fileName=imageFile , modTimes=modificationTime )
然后,我的plotsPage.html模板文件有一个如下标记,该标记使用刚刚在服务器端查找的mod time创建必要的查询字符串

<img src="{{ url_for( 'sendPlotImage' , filename=fileName , t=modTime ) }}">

然后,我连接到的url使用send\u from\u目录为实际图像提供服务。我有一个视图模型,它为我提供了我的应用程序下的子文件夹,在这个文件夹中,我的图像可以通过会话状态和所有其他方式逐个用户检索

@flaskApp.route( '/Images/<filename>' , methods=['GET'] )
def sendPlotImages( filename ) :   
    # Image file not generated, send placeholder instead to denote file does not exist.
    if not os.path.isfile( "%s/%s" % ( model.getImagesSubfolder( ) , filename )  ) :
        return send_from_directory( "static" , placeHolderImage )

    return send_from_directory( model.getImagesSubfolder( ) , filename )
@flaskApp.route('/Images/',methods=['GET'])
def sendPlotImages(文件名):
#未生成图像文件,请改为发送占位符以表示文件不存在。
如果不是os.path.isfile(“%s/%s”%(model.getImagesSubfolder(),filename)):
从_目录返回发送_(“静态”,占位符图像)
从目录返回发送目录(model.getImagesSubfolder(),文件名)

您应该以字节形式传递img

%pylab
from io import BytesIO
x = np.linspace(0, np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
fig = plt.gcf()
buffer = BytesIO
fig.canvas.print_png(buffer)
buffer.seek(0)
您可以使用
send_file
发送img:

from flask import send_file
@app.route('/img')
def images():
    return send_file(buffer, mimetype="image/png")

嗯,这样我就不会渲染模板了?是否可以编辑您的示例代码以适合我提供的代码。我的函数当前没有路由。这只是一个处理函数。您可以使用渲染img。我更喜欢这样做。我如何将图像发送到HTML模板。这似乎是一个可以有人检查的副本?这不起作用。返回了一个错误。是否可以编辑您的示例以适合我提供的代码?我仍在努力解决这一问题。我提供的代码必须适应您的环境,例如
模型。getImagesSubfolder()
Placeholder Image
是特定于我的应用程序的,但提供这些代码是为了让您考虑将这些内容结构化到您所拥有的内容。你犯了什么错误?我用另一种方式解决了这个问题,谢谢!