使用 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
个请求.
如果有任何不清楚的地方,请告诉我:)
这段代码呈现了一个 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
个请求.
如果有任何不清楚的地方,请告诉我:)