Flask表单提交遇405错误及URL未找到问题求助
问题分析与修复方案
核心问题
- 405 Method Not Allowed错误:Flask路由按定义顺序匹配,你的动态路由
@app.route('/<string:page_name>')写在/generic路由之前,会优先接管所有请求(包括POST到/generic的表单提交),而动态路由默认仅支持GET方法,导致POST请求被拒绝。 - /generic URL未找到:动态路由优先匹配后,
/generic被当作page_name参数,尝试渲染generic.html模板;若模板不存在则报错,同时你的submit_form路由完全没被触发。
修复步骤
1. 调整路由顺序
将具体的/generic路由移到动态路由之前,确保Flask优先匹配明确路径:
import csv from flask import Flask, render_template, request, redirect, url_for import os app = Flask(__name__) @app.route('/') def my_home(): return render_template('index.html') # 把/generic路由放在动态路由前面 @app.route('/generic', methods=['GET', 'POST']) def submit_form(): print("You have reached the right place") if request.method == 'POST': try: data = request.form.to_dict() write_to_csv(data) # 用url_for生成可靠跳转链接 return redirect(url_for('html_page', page_name='generic.html')) except Exception as e: print(e) return 'Something went wrong, It did not save in the database' # GET请求直接返回generic.html模板 return render_template('generic.html') # 动态路由放在最后 @app.route('/<string:page_name>') def html_page(page_name): return render_template(page_name) def write_to_csv(data): with open('database.csv', mode='a', newline='') as database2: name = data['name'] email = data['email'] message = data['message'] csv_writer = csv.writer(database2, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) csv_writer.writerow([name, email, message])
2. 保留原表单配置
你的HTML表单action="/generic"配置正确,无需修改:
<form method="post" action="/generic"> <!-- 表单字段内容 --> </form>
3. 确认模板文件存在
检查项目的templates目录下是否存在generic.html,若不存在需创建该模板文件,否则访问或跳转时会提示模板未找到。
额外优化
- 移除重复的
import csv语句,代码中重复导入了两次,保留一次即可。 - 始终使用
url_for生成路由链接,避免硬写路径导致的维护问题。
内容的提问来源于stack exchange,提问作者Iliketrees
相关产品推荐
相关产品推荐

