使用 Flask/Python 在 HTML 中从 sqlite 服务器渲染 Blob

Render Blob from sqlite server in HTML with Flask/Python

这段代码呈现了一个 html 模板,其中包含我的数据库中的值

        displayrows = db.execute("SELECT * FROM profiles WHERE profile_id = :profile_id", (session["user_id"],))
        displayrows = db.fetchall()
        displaycount = db.execute("SELECT COUNT(*) FROM bucketlist WHERE wish_id = :wish_id", (session["user_id"],))
        for i in displayrows:
            bytes_io = BytesIO(i[5])
        for i in displaycount:
            return render_template("profile.html", rows = displayrows, count = i[0], image = bytes_io)

这是呈现值的 html 页面的一部分...

<div class="card bg-dark" style="width: 18rem;">
    <p class="list-group-item">BucketList Size - {{ count }}</p>
    {%for row in rows%}
        <ul class="list-group list-group-flush">  
            <li class="list-group-item">Location - {{ row[1] }}, {{row[2]}}</li>
            <li class="list-group-item">Looking for - {{row[3] }}</li>
            <li class="list-group-item">Bio - {{row[4]}}</li>
        </ul>  
    {%endfor%}
         <img src="{{image}}" />
</div>

我对 python、flask 和一般编码还很陌生,所以如果有人花时间解释我如何成功地在 [=20= 上显示来自 blob 列的数据,我将不胜感激] 页。提前致谢

一些观察:

  • for 循环中不能有 return 语句。视图函数只能return一次。
  • 您需要一个路由来呈现个人资料页面,另一个路由 return 图片。

我想我正在对您在这里尝试做的事情做出一些假设,但希望这是有道理的...


有一个呈现个人资料页面的路线:

@app.route('/profile')
def profile():

    # You could pull several profiles here, but as you provide an id it just pulls one:
    db.execute("SELECT * FROM profiles WHERE profile_id = ?", (session["user_id"],))

    # Again, this supports multiple had the query been `SELECT * FROM profiles`
    displayrows = db.fetchall()
    
    return render_template("profile.html", rows = displayrows)

然后在模板 profile.html 中,在 for 循环中使用 flask 的 url_for 函数为图像生成一个 link,传递 row[0](应该是配置文件的 ID)作为 ident 参数:

{% for row in rows %}
        ...
        <img src='{{ url_for("profile_image", ident = row[0]) }}' />
        ...
{% endfor %}

url_for 函数将为下一条路线输出正确的 hyperlink。请注意这是如何接受 ident 这是配置文件 ID。您需要将 your_blob_col 替换为包含 bolb 的列标题:

from flask import send_file

@app.route('/i/<int:ident>')
def profile_image(ident):
    db.execute("SELECT your_blob_col FROM profiles WHERE profile_id = ?", (ident,))
    result = db.fetchone() # There's only one
    image_bytes = result[0] # The first and only column

    bytes_io = BytesIO(image_bytes)

    return send_file(bytes_io, mimetype='image/jpeg')  

所以 <img> 标签中的 hyperlink 将呈现为类似 /i/123 的内容,当由 profile_image 函数处理时,图像将 return数据。

您可以在浏览器的开发工具(“网络”选项卡)中检查这些请求,以便更好地了解正在发生的事情。如果您的 profile 函数取而代之的是提取 n 个配置文件,那么您会看到 profile 路由的 1 个请求,以及 profile_image 路由的 n 个请求.

如果有任何不清楚的地方,请告诉我:)