Flask表单POST请求无法获取数据,请求技术协助
问题排查与修复方案
看了你的代码和错误日志,我发现几个核心问题导致POST请求无法正常获取表单数据,咱们一步步来解决:
1. 表单提交的目标路由不对
从错误日志里的 POST /grants/search HTTP/1.1" 400 - 能看出来,你的表单提交到了 /grants/search,但你处理POST请求的后端路由是 /searchgrantprogs,这就导致请求根本没走到正确的处理逻辑里。
你的前端表单action是空的,默认会提交到当前页面URL。你需要把action明确改成正确的路由:
<form id="grant_edit" action="/searchgrantprogs" method="POST">
2. 后端获取表单字段的变量名写错了
前端隐藏输入框的name是grant_id,但后端POST分支里写的是request.form.get('grantid')(少了下划线),这肯定拿不到值。而且你最后返回模板时用了未定义的grantid变量,这会直接引发报错。
修改后端POST部分的代码:
if request.method == 'POST': # 注意字段名是grant_id,和前端对应 grant_id = request.form.get('grant_id') # 先打印调试,确认是否拿到值 print(f"POST收到的grant_id: {grant_id}") # 这里可以添加你的业务逻辑,比如更新数据库等 # 示例:如果需要操作grants_programmes表,写对应的SQL flash("更新成功!") return render_template('search_grants.html', grant_id=grant_id)
3. 额外的调试小技巧
- 提交表单前,打开浏览器开发者工具(F12)的Network面板,查看POST请求的Form Data,确认
grant_id是否被正确发送。 - 后端可以直接打印整个
request.form:print(request.form),这样能直观看到所有提交过来的字段,方便排查。 - 400状态码一般是请求格式错误,比如路由不匹配、必填字段缺失,修复上面两个问题后应该就能解决。
另外,你的GET分支还有个小bug:你定义了grantid = request.args.get('grant_id'),但SQL查询里用的是固定值grant_id=0,应该改成用拿到的grantid:
if request.method == 'GET': sql_grantprogs = """SELECT grant_id, programme_id FROM grants_programmes WHERE grant_id=:a; """ grantid = request.args.get('grant_id') print(grantid) # 这里要用拿到的grantid,而不是固定的0 r_grantprogs = list(conn.execute(text(sql_grantprogs), a=grantid)) return json.dumps([dict(r) for r in r_grantprogs])
这样调整后,POST请求应该就能正常获取到grant_id并执行后续逻辑了。
内容的提问来源于stack exchange,提问作者Clives-online
相关产品推荐
相关产品推荐

