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

Flask从MySQL取数据到HTML页面不显示问题求助

Flask展示MySQL数据问题排查与修复

核心问题与修复步骤

1. 路由装饰器语法错误

你的app.route('/display', methods=['GET'])缺少**@符号**,这是Flask路由的必填语法,没有@的话路由不会被注册,访问/display时根本不会执行display()函数。

修复:

@app.route('/display', methods=['GET'])  # 添加@符号
def display():
    # ... 原有代码

2. 模板变量名不匹配

你在render_template里传递的变量是info_table=data,但HTML模板里循环的是data,两者名称不对应,模板找不到数据自然无法渲染。

修复二选一:

  • 修改Python代码,统一变量名:
    return render_template('display.html', data=data)
    
  • 或者修改HTML模板,匹配传递的变量名:
    {% for row in info_table %}
    

3. HTML文件语法错误

HTML第一行的t<!DOCTYPE html>多了个t字符,会导致页面解析异常,必须删掉。

修复后第一行:

<!DOCTYPE html>

4. Flask运行端口冲突

你设置app.run(port=3306),但3306是MySQL的默认端口,Flask用这个端口会和数据库服务冲突,导致Flask无法正常启动。

修复:改用Flask默认端口5000或其他未被占用的端口:

app.run(host='localhost', port=5000)

5. 数据库HOST配置缺失

app.config['MYSQL_HOST'] = ''为空,虽然你说连接成功,但建议明确填写数据库地址(本地数据库填'localhost'),避免潜在连接问题:

app.config['MYSQL_HOST'] = 'localhost'

修复后的完整代码

app.py

from flask import Flask, render_template, request
from flask_mysqldb import MySQL

app = Flask(__name__)
app.debug = True

# 完善数据库配置
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = ''  # 填入你的数据库密码
app.config['MYSQL_DB'] = 'DB'

mysql = MySQL(app)

# 修复路由装饰器
@app.route('/display', methods=['GET'])
def display():
    cursor = mysql.connection.cursor()
    cursor.execute("SELECT * FROM info_table")
    data = cursor.fetchall()
    # 确保变量名和模板一致
    return render_template('display.html', data=data)

# 修复端口问题
app.run(host='localhost', port=5000)

display.html

<!DOCTYPE html>
<html>
<head>
 <title>用户信息展示</title>
</head>
<body>
<style>
 td {
        width: 150px;
        text-align: center;
        border: 1px solid black;
        padding: 5px;
      }
 th {
        border: 1px solid black;
        padding: 5px;
        background-color: #f0f0f0;
      }
</style>
<table>
  <thead>
    <tr>
        <th>name</th>
        <th>age</th>
    </tr>
    </thead>
    <tbody>
     {% for row in data %}
            <tr>
                <td>{{row[0]}}</td>
                <td>{{row[1]}}</td>
            </tr>
        {% endfor %}
    </tbody>
</table>
</body>
</html>

可选优化:使用字典游标

如果想在模板里直接用字段名(比如{{row.name}})而不是索引,可以改用字典游标,代码修改如下:

@app.route('/display', methods=['GET'])
def display():
    # 使用字典游标
    cursor = mysql.connection.cursor(mysql.cursors.DictCursor)
    cursor.execute("SELECT * FROM info_table")
    data = cursor.fetchall()
    return render_template('display.html', data=data)

模板里就可以这样写:

{% for row in data %}
    <tr>
        <td>{{row.name}}</td>
        <td>{{row.age}}</td>
    </tr>
{% endfor %}

内容的提问来源于stack exchange,提问作者Darian Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:34:57