Python 将绘图从matpotlib传递到烧瓶视图

Python 将绘图从matpotlib传递到烧瓶视图,python,matplotlib,flask,Python,Matplotlib,Flask,我试图绘制一些值,并将它们传递给一个Flask模板。我试着用这个方法: 不幸的是,我得到了这个错误 TypeError:应为字符串参数,获得“字节” 当我将img类型更改为BytesIO时,我成功地访问了模板,但它仍然无法显示绘图 我死在水里了,有人能帮忙吗 这是我的阴谋 @app.route('/plot', methods=['POST']) # I use POST because I will introduce user specified data def plot(): if re

我试图绘制一些值,并将它们传递给一个Flask模板。我试着用这个方法:

不幸的是,我得到了这个错误

TypeError:应为字符串参数,获得“字节”

当我将img类型更改为BytesIO时,我成功地访问了模板,但它仍然无法显示绘图

我死在水里了,有人能帮忙吗

这是我的阴谋

@app.route('/plot', methods=['POST']) # I use POST because I will introduce user specified data
def plot():
if request.method == 'POST':

    img = io.BytesIO()
    x = [1,2,3,6,7]
    y = [4,6,7,9,10]
    plt.plot(x, y)
    plt.savefig(img, format='png')
    plt.savefig("../xxxx.png") # this works just fine
    img.seek(0)
    plot_url = base64.b64encode(img.getvalue())
    return render_template('plot.html', plot_url=plot_url)
这是plot.html:

{% extends "layout.html" %}
{% block body %}


<img src="data:image/png;base64, {{ plot_url }}" width="20" height="20" alt="graph">
{% endblock %}
{%extends“layout.html”%}
{%block body%}
{%endblock%}

您使用的Python版本是什么?在Python3.x上
base64.b64encode()
返回
bytes
对象,这就是它可能失败的原因。在将其传递给Flask之前,需要将其解码为字符串。此外,您应该对base64编码字符串进行URL转义,因为您正在HTML中打印它,例如:

import urllib.parse

# ...

img = io.BytesIO()  # create the buffer
plt.savefig(img, format='png')  # save figure to the buffer
img.seek(0)  # rewind your buffer
plot_data = urllib.parse.quote(base64.b64encode(img.read()).decode()) # base64 encode & URL-escape
return render_template('plot.html', plot_url=plot_data)

您使用的是什么Python版本?在Python3.x上
base64.b64encode()
返回
bytes
对象,这就是它可能失败的原因。在将其传递给Flask之前,需要将其解码为字符串。此外,您应该对base64编码字符串进行URL转义,因为您正在HTML中打印它,例如:

import urllib.parse

# ...

img = io.BytesIO()  # create the buffer
plt.savefig(img, format='png')  # save figure to the buffer
img.seek(0)  # rewind your buffer
plot_data = urllib.parse.quote(base64.b64encode(img.read()).decode()) # base64 encode & URL-escape
return render_template('plot.html', plot_url=plot_data)

你看过了吗:谢谢,是的,我看到了这个帖子,但它并没有解决我的问题。将类型更改为BytesIO可以解决不兼容问题,但我仍然无法在浏览器中看到图像。在我看来,问题可能在于编码,因为当我试图将FIG保存到一个文件时,它工作得很好。你能发布一些有问题的代码吗?我编辑了我的第一篇博文你看过了吗:谢谢,是的,我看到了这篇博文,但它并没有解决我的问题。将类型更改为BytesIO可以解决不兼容问题,但我仍然无法在浏览器中看到图像。在我看来,问题可能在于编码,因为当我试图将FIG保存到一个文件时,它工作得很好。你能发布一些有问题的代码吗?如果我知道错误是从哪里来的,我会回答得更好。我编辑了我最初的帖子是的,它成功了!我确实在使用Python3。非常感谢。只是一个小建议。我认为在Python3.x中,我们需要使用import urllib.parse而不是importurllib@ShivamAgrawal-更新,谢谢您的关注。是的,成功了!我确实在使用Python3。非常感谢。只是一个小建议。我认为在Python3.x中,我们需要使用import urllib.parse而不是importurllib@ShivamAgrawal-更新,谢谢您的关注。