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

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校验:

  1. 导入csrf_exempt装饰器,给signup路由加豁免标记:
from flask_wtf.csrf import csrf_exempt

@user.route('/signup', methods=['GET', 'POST'])
@csrf_exempt
def signup():
    # 原有逻辑保持不变
  1. 若要全局关闭CSRF防护,可在Flask配置中添加:
WTF_CSRF_ENABLED = False

内容的提问来源于stack exchange,提问作者Jonathan Bechtel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:03:03