Flask-WTF出现“CSRF会话令牌缺失”错误的问题求助
Flask CSRF令牌验证失败解决办法
问题根源
Flask-WTF的CSRF保护有两个核心要求,没满足就会触发「The CSRF session token is missing」错误:
- CSRF令牌和后端会话绑定,请求必须携带会话Cookie(
generate_csrf()生成的令牌会存在会话里,没Cookie后端找不到对应会话) - 默认只识别
X-CSRFToken这个请求头,用别的头名后端读不到令牌
具体修复步骤
1. 确保请求带会话Cookie
用Postman请求/login时,必须带上之前请求/api/csrf_token时返回的会话Cookie。Postman默认会自动保存并携带Cookie,你可以在请求的「Cookies」面板里确认是否包含Flask的会话Cookie(默认名为session)。
2. 改用正确的请求头
把Postman里的请求头改成X-CSRFToken,值填获取到的CSRF令牌。Flask-WTF默认监听这个头,换别的名字就会识别失败。
3. 可选:自定义CSRF头名(如果有特殊需求)
要是必须用自定义头,在Flask配置里加一行:
app.config['WTF_CSRF_HEADERS'] = ['X-Your-Custom-Header-Name']
但尽量用默认的X-CSRFToken,省得额外配置。
4. 代码优化(可选)
可以把get_csrf_token接口改成同时把令牌写到Cookie里,前端也能直接从Cookie读,不用单独存返回值:
@app.route('/api/csrf_token', methods=['GET']) @csrf.exempt def get_csrf_token(): csrf_token = generate_csrf() resp = jsonify({'csrf_token': csrf_token}) resp.set_cookie('csrf_token', csrf_token, httponly=False) # 设为False让前端能读取 return resp
测试流程
- 先GET请求
/api/csrf_token,拿到令牌并确认Cookie已生成 - Postman开启Cookie自动携带,设置
X-CSRFToken头为令牌值 - 发送POST请求到
/login,错误应该就消失了
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

