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
相关产品推荐
相关产品推荐

