Flask网站提交表单至app.py时出现404错误,数据无法写入数据库
Flask网站提交表单至app.py时出现404错误,数据无法写入数据库
看起来你遇到的404错误核心原因是表单的action路径设置错了,Flask作为Web框架,是通过路由规则来处理请求的,而不是直接访问app.py文件本身。下面我帮你一步步排查并修复所有问题:
1. 修复表单的Action路径(404的直接原因)
你的HTML表单里把action指向了文件系统路径/YR12--Assessments-Repository/Website/app.py,但Flask运行时,应用的根路径是/,所有请求都是通过你在app.py里定义的路由(比如@app.route('/'))来处理的。
修改表单的action为根路径/即可:
<form style="text-align: center;" method="POST" action="/">
2. 修复数据库表创建的语法错误
app.py里的CREATE TABLE语句有语法问题:VoterName TEXT后面缺少逗号,这会导致SQL执行失败,表无法正常创建。修正后的表创建代码:
create_table_query = ''' CREATE TABLE IF NOT EXISTS voters ( VoterID INTEGER PRIMARY KEY AUTOINCREMENT, VoterName TEXT, VoterAge INTEGER, CandidateID INTEGER REFERENCES candidates(CandidateID) )'''
3. 修正INSERT语句的字段匹配与安全问题
这里有两个关键问题需要解决:
- 你的表字段是
VoterName、VoterAge,但原来的INSERT语句用的是name、age,字段名不匹配会直接导致数据库报错; - 用字符串格式化拼接SQL语句存在严重的SQL注入漏洞,必须改用Flask+SQLite推荐的参数化查询方式。
同时,表单里的candidate字段也要同步写入数据库(对应表的CandidateID),修正后的POST处理代码:
@app.route('/', methods = ['POST']) def send_to_database(): votername = request.form['name'] voterage = request.form['age'] candidate_id = request.form['candidate'] connection = sqlite3.connect('database.db') cursor = connection.cursor() # 用?作为占位符的参数化查询,从根源避免SQL注入 query1 = "INSERT INTO voters (VoterName, VoterAge, CandidateID) VALUES (?, ?, ?)" cursor.execute(query1, (votername, voterage, candidate_id)) connection.commit() connection.close() # 操作完成后务必关闭数据库连接 return "投票提交成功!" # 可以返回提示,或者重定向回首页
4. 优化表单的Candidate选项值
你的select选项里value="id"语义模糊,建议改成真实的候选ID(比如1),这样存入数据库的ID更符合业务逻辑:
<option value="1">John Smith</option>
5. 确认项目文件结构
Flask默认会从templates文件夹加载模板文件,所以你的项目结构需要符合以下规范:
Website/ ├── app.py ├── templates/ │ └── index.html <!-- 你的HTML文件必须放在这个文件夹下 --> └── database.db
做完以上修改后,重启Flask应用,访问http://localhost:5000提交表单,404错误应该就消失了,数据也能正确写入数据库啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

