Flask路由返回400 Bad Request,无法渲染HTML模板问题排查
排查Flask 400 Bad Request错误的几个关键点
嘿,我帮你梳理了下代码里的问题,这应该就是你遇到400错误的核心原因:
1. 路由未区分请求方法,直接读取表单导致报错
你的/sign路由同时支持POST和GET方法,但函数里直接去取request.form['amount']这类字段——当用GET请求访问该路由时(比如直接在浏览器输入http://localhost:5000/sign),request.form是空的,强行访问不存在的键就会触发Flask的400错误。
修正方案:
只在POST请求时处理表单数据,GET请求返回表单页面或做重定向:
from flask import request, render_template @app.route('/', methods=['POST', 'GET']) # 注意这里之前的拼写错误已经修正 def main_page(): return render_template('sign.html') @app.route('/sign', methods=['POST', 'GET']) def SignResource(): if request.method == 'POST': # 用get()方法替代直接索引,避免字段缺失时直接报错 data = { "amount": request.form.get('amount'), "payway": request.form.get('payway'), "description": request.form.get('description') } # 这里可以添加数据校验、存储等逻辑,比如返回结果页面 return render_template('sign_result.html', data=data) # GET请求时返回表单页面 return render_template('sign.html')
2. 根路由的拼写错误
你第一个路由写的是@app.rout('/', ...)——这里rout少了字母e,正确写法是@app.route,这个错误会导致根路径/无法正常注册,用户访问根目录会得到404,虽然不是当前400错误的直接原因,但必须修正。
3. HTML表单的语法小问题
你的input标签里多了不必要的逗号,而且遗漏了div闭合标签,虽然浏览器可能兼容,但不符合规范:
<form action="http://localhost:5000/sign" method="post"> <div class="pay_info"> <input type="text" name='amount' value="12.34"> <input list="currency_list" name="payway" autofocus> <datalist id="currency_list"> <option value="RUB"> <option value="USD"> <option value="EUR"> </datalist> <div class='description_text'> <input type="text" name='description' value='Test description'> </div> <input type="submit"> </div> <!-- 补上遗漏的闭合div --> </form>
把这些问题修正后,再测试提交表单,应该就能正常渲染模板、处理数据了。
内容的提问来源于stack exchange,提问作者Ivan Pozniak
相关产品推荐
相关产品推荐

