You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask/Python Web应用二维码无法在表格显示的问题求助

问题分析与解决方案

核心问题点

  1. 路由定义错误:/qrkoder 路由缺少 @app.route 装饰器,且未通过URL规则正确接收brukerID参数;同时路由返回模板而非图片数据,无法直接作为图片源使用。
  2. 模板变量误用:HTML模板中错误引用了未在skjema路由中传递的alle_qrkoder变量,未从循环的bruker对象中提取对应二维码数据。
  3. 数据获取方式问题:原路由中使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:45:03