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

Flask render_template与Jinja2失效问题求助

问题排查与修正方案

核心问题梳理

  • 表单提交后跳转本地文件路径而非Flask路由
  • Jinja2模板代码未被解析,直接以文本显示
  • 表单数据无法被Flask后端获取
  • 数据库连接与操作存在逻辑错误

1. 模板文件路径问题(根源)

Flask默认只会解析与server.py同级的templates文件夹中的HTML文件,若你的HTML文件不在这个目录下,Jinja2语法(如{{url_for()}})会被原样输出,浏览器会把它识别为本地路径,导致提交失败。

强制要求的项目结构:

你的项目文件夹/
├─ server.py
└─ templates/
   ├─ index.html
   └─ registration.html

2. 表单元素缺失name属性

当前index.html的输入框只有id,没有name属性,Flask的request.form.get()无法获取提交的数据,必须给每个input补充name:

<!-- 修正后的index.html输入框示例 -->
<tr>
    <td>Name</td><td><input type="text" id="name" name="name"></td>
</tr>            
<tr>
    <td>Email</td><td><input type="text" id="email" name="email"></td>
</tr>
<tr>
    <td>PhoneNumber</td><td><input type="text" id="phonenumber" name="phonenumber"></td>
</tr>
<tr>
    <td>Address</td><td><input type="text" id="address" name="address"></td>
</tr>

3. 数据库操作逻辑错误

原代码在Flask启动前就建立数据库连接,且提交/关闭操作在app.run()之后执行(app.run()是阻塞的,后续代码永远不会运行),同时缺少表存在性检查。

修正后的server.py数据库代码:

from flask import Flask, render_template, request
import sqlite3

app = Flask(__name__)

# 封装数据库连接方法,保证每次请求的连接独立
def get_db_connection():
    con = sqlite3.connect("Registration.db")
    # 提前创建表,避免插入时报错
    con.execute('''CREATE TABLE IF NOT EXISTS Registration
                 (Name TEXT, Email TEXT, Phonenumber TEXT, Address TEXT)''')
    return con

@app.route('/')
def index():
    return render_template("index.html")

@app.route('/form', methods=["POST"])
def form():
    name = request.form.get("name")
    email = request.form.get("email")
    phonenumber = request.form.get("phonenumber")
    address = request.form.get("address")

    con = get_db_connection()
    con.execute("INSERT INTO Registration(Name, Email, Phonenumber, Address) VALUES(?,?,?,?)", 
                (name,email,phonenumber,address))
    con.commit()  # 插入后立即提交数据

    cursor = con.execute("SELECT Name, Email, Phonenumber, Address FROM Registration")
    rows = cursor.fetchall()
    con.close()  # 操作完成后关闭连接

    return render_template("registration.html", data = rows)

if __name__ == '__main__':
    app.run(debug=True, port=5000)

4. registration.html模板错误

  • Jinja2输出语法错误:{% row[0] %}是控制流语法,变量输出必须用{{ row[0] }}
  • 跳转链接使用本地绝对路径,需改为Flask路由生成的路径:
<!-- 修正后的registration.html -->
<!DOCTYPE html>
<html>
<head><title>Registration_list</title></head>
<body>
    <table>
        <tr>
            <th>Name</th><th>Email</th><th>Phonenumber</th><th>Address</th>
        </tr>
        {% if data %}
            {% for row in data %}
            <tr><td>{{ row[0] }}</td><td>{{ row[1] }}</td><td>{{ row[2] }}</td><td>{{ row[3] }}</td></tr>
            {% endfor %}
        {% endif %}
    </table>
    <a href="{{ url_for('index') }}">Submit another form</a>
</body>
</html>

5. 直接访问registration.html的问题

只有通过Flask的render_template返回的模板才会解析Jinja2语法,直接打开本地HTML文件或用file://协议访问,浏览器只会把它当成普通文本。若需要通过GET方式访问,可添加路由:

@app.route('/registration')
def registration():
    con = get_db_connection()
    cursor = con.execute("SELECT Name, Email, Phonenumber, Address FROM Registration")
    rows = cursor.fetchall()
    con.close()
    return render_template("registration.html", data=rows)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:13:22