如何在Flask中显示来自MySql数据库的图像

时间:2018-04-12 11:29:30

标签: python mysql image flask

我有以下型号。我成功地将数据插入到mysql数据库中,但我无法在索引页面中显示该图像。如何在我的模板中将mysql中的LargeBinary对象显示为图像?

class ginfo(db.Model):

    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(20))
    comment=db.Column(db.String(1000))
    picdata=db.Column(db.LargeBinary)

我从页面获得了变量:

        name=request.form['name']
        comment=request.form['comment']
        file=request.files['inputFile']

并将数据插入到mysql中:

    signature=ginfo(name=name,comment=comment,picdata=file.read())
    db.session.add(signature)
    db.session.commit()

我用以下内容查询整个行和列:

    result=ginfo.query.all()
    return render_template('index.html',result=result)

我试图将数据显示如下:

{%for r in result%}
<div class="page-header">
<h1>{{r.name}}</h1>
</div>
<div class="well">
<p>{{r.comment}}</p>
</div>
<img src={base64.decodestring(r.picdata)}/>
{%endfor%}

1 个答案:

答案 0 :(得分:1)

您可以解决此问题,例如使用路线将图像数据作为响应提供,例如:创建:

@app.route('/img/<int:img_id>')
def serve_img(img_id):
    pass # look up via id, create response with appropriate mimetype

在模板中,请参阅此路线:

{% for r in result %}
<img src="{{ url_for('serve_img', img_id=r.id)}}"
{% endfor %}

另一种方法是使用data url将图像直接嵌入到您的回复中,基本上对您的数据进行base64编码并将其直接包含在您呈现的响应页面中。

我个人避免使用第二种方法,因为编码为base64会将大小增加大约30%,并且将图像嵌入为数据网址也会阻止客户端进行有效的缓存。