Flask应用POST请求浏览器提交正常,使用requests库终端请求返回400错误
原因分析
FlaskForm默认开启CSRF(跨站请求伪造)防护机制,浏览器访问注册页时,渲染的表单会自动包含隐藏的csrf_token字段,提交时会和cookie中的校验值匹配。你用requests发起POST请求时没有携带该字段,触发CSRF校验失败,直接返回400状态码。
解决方案
方案一:携带CSRF Token发起请求(推荐)
先通过GET请求获取注册页的CSRF Token,再携带该参数发起POST请求,示例代码如下:
import requests from bs4 import BeautifulSoup # 用Session保持cookie上下文 client = requests.Session() # 第一步:GET请求获取csrf token get_resp = client.get("http://localhost:5000/signup") soup = BeautifulSoup(get_resp.text, "html.parser") csrf_token = soup.find("input", {"name": "csrf_token"})["value"] # 第二步:构造带csrf_token的POST请求 post_data = { "email": "myemail@gmail.com", "password": "Passw0rd!", "sec_question": "What is your favorite band?", "sec_answer": "paul simon", "csrf_token": csrf_token } post_resp = client.post("http://localhost:5000/signup", data=post_data)
方案二:临时关闭CSRF校验(仅本地测试使用,禁止生产环境配置)
如果只是本地调试,可以选择关闭对应路由的CSRF校验:
- 导入
csrf_exempt装饰器,给signup路由加豁免标记:
from flask_wtf.csrf import csrf_exempt @user.route('/signup', methods=['GET', 'POST']) @csrf_exempt def signup(): # 原有逻辑保持不变
- 若要全局关闭CSRF防护,可在Flask配置中添加:
WTF_CSRF_ENABLED = False
内容的提问来源于stack exchange,提问作者Jonathan Bechtel
相关产品推荐
相关产品推荐

