搭建Flask数据库网站时遭遇405 Method Not Allowed错误求助
问题分析与修复方案
1. 405错误的核心原因
浏览器访问网站时默认发送GET请求,但你的根路由@app.route('/', methods=['POST'])仅允许POST方法,这直接导致访问首页时触发405 Method Not Allowed错误。
2. 代码中的其他关键问题
除了405错误,代码还有多处会导致功能失效或报错的问题:
- SQL语法错误:创建
voters表的语句中,VoterName TEXT、VoterAge INTEGER末尾缺少逗号,执行时会直接抛出SQL语法异常。 - 路由逻辑混乱:根路由负责建表并返回模板,但未支持GET请求展示页面;单独的
/index.html路由仅支持POST,无法正常访问页面。 - 表名与字段名不匹配:插入数据时写的是
INSERT INTO database (name,age),但实际表名是voters,字段名是VoterName、VoterAge,完全不对应。 - SQL注入风险:用字符串格式化拼接SQL语句是高危操作,容易被注入攻击。
- 缺少响应返回:
send_to_database函数执行完数据库操作后无任何返回,Flask会抛出500服务器错误。 - 数据库连接泄漏:
send_to_database中打开连接后未关闭,长期运行会耗尽连接资源。
3. 修复后的完整代码
from flask import Flask, render_template, request, redirect, url_for import sqlite3 app = Flask(__name__) # 支持GET请求展示页面,POST请求处理表单提交 @app.route('/', methods=['GET', 'POST']) def main(): # 初始化数据库表(建议移到启动时执行,避免每次请求重复执行) connection = sqlite3.connect('database.db') cursor = connection.cursor() create_table_query = ''' CREATE TABLE IF NOT EXISTS voters ( VoterID INTEGER PRIMARY KEY AUTOINCREMENT, VoterName TEXT, VoterAge INTEGER, CandidateID INTEGER REFERENCES candidates(CandidateID) )''' cursor.execute(create_table_query) connection.commit() connection.close() if request.method == 'POST': # 获取表单数据并简单校验 votername = request.form.get('name') voterage = request.form.get('age') if votername and voterage: connection = sqlite3.connect('database.db') cursor = connection.cursor() # 参数化查询避免SQL注入 query = "INSERT INTO voters (VoterName, VoterAge) VALUES (?, ?)" cursor.execute(query, (votername, voterage)) connection.commit() connection.close() # 重定向防止表单重复提交 return redirect(url_for('main')) # GET请求或提交完成后返回页面 return render_template('index.html') if __name__ == '__main__': app.run(debug=True)
4. 配套模板注意事项
确保你的index.html表单配置正确:
<form method="POST"> <input type="text" name="name" placeholder="姓名" required> <input type="number" name="age" placeholder="年龄" required> <button type="submit">提交</button> </form>
内容的提问来源于stack exchange,提问作者Xeno
相关产品推荐
相关产品推荐

