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

搭建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:06:17