Flask/Python Web应用二维码无法在表格显示的问题求助
问题分析与解决方案
核心问题点
- 路由定义错误:
/qrkoder路由缺少@app.route装饰器,且未通过URL规则正确接收brukerID参数;同时路由返回模板而非图片数据,无法直接作为图片源使用。 - 模板变量误用:HTML模板中错误引用了未在
skjema路由中传递的alle_qrkoder变量,未从循环的bruker对象中提取对应二维码数据。 - 数据获取方式问题:原路由中使用
fetchall()获取单用户二维码,返回的是列表而非单个值,无法直接用于图片渲染。
解决方案一:直接在模板中使用已查询的用户数据(最简单)
你的skjema路由已经查询了所有用户的完整信息(包括qrKode字段),无需额外路由,直接在模板循环中提取每个用户的二维码数据即可。
修复后的HTML模板代码
{% for bruker in alle_brukere %} <tr> <td>{{ bruker[1] }}</td> <td>{{ bruker[2] }}</td> <!-- 假设数据库表字段顺序为:brukerID[0], forNavn[1], etterNavn[2], qrKode[3] --> <td><img src="data:image/png;base64,{{ bruker[3] }}" alt="QR-kode"></td> </tr> {% endfor %}
进阶优化:使用字典游标避免索引错误
为了避免依赖字段顺序,可将数据库游标改为字典游标,直接通过字段名访问数据:
# 修改skjema路由中的查询部分 cur = mysql.connection.cursor(dictionary=True) # 使用字典游标 cur.execute("SELECT * FROM qrkode") alle_brukere = cur.fetchall() cur.close()
对应的模板代码更直观:
{% for bruker in alle_brukere %} <tr> <td>{{ bruker.forNavn }}</td> <td>{{ bruker.etterNavn }}</td> <td><img src="data:image/png;base64,{{ bruker.qrKode }}" alt="QR-kode"></td> </tr> {% endfor %}
解决方案二:独立路由返回图片(更优雅,适合大数据量)
如果二维码数据量较大,直接在模板中嵌入base64会影响页面加载速度,可改为通过独立路由返回图片二进制数据:
修复后的/qrkoder路由代码
@app.route('/qrkoder/<int:brukerID>') # 正确定义带参数的路由 def vis_qrkoder(brukerID): cur = mysql.connection.cursor() cur.execute("SELECT qrKode from qrkode WHERE brukerID = %s", (brukerID,)) qr_record = cur.fetchone() # 单用户只需要一条记录 cur.close() if qr_record: # 将base64字符串解码为二进制图片数据 img_bytes = base64.b64decode(qr_record[0]) # 返回图片响应 return Response(img_bytes, mimetype='image/png') else: return "QR-kode ikke funnet", 404
对应的HTML模板代码
{% for bruker in alle_brukere %} <tr> <td>{{ bruker[1] }}</td> <td>{{ bruker[2] }}</td> <!-- 通过url_for生成图片路由地址 --> <td><img src="{{ url_for('vis_qrkoder', brukerID=bruker[0]) }}" alt="QR-kode"></td> </tr> {% endfor %}
额外注意事项
- 确保数据库表
qrkode的qrKode字段存储的是完整的base64编码字符串(无多余空格或换行)。 - 原
skjema路由中finally块里的img_buffer.close()可省略,因为BytesIO是内存对象,Python会自动回收资源。
内容的提问来源于stack exchange,提问作者oljo
相关产品推荐
相关产品推荐

