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

添加CSRF保护后Flask出现错误及依赖异常求助

问题解决方案

一、解决"CSRF token缺失"错误

针对不同请求类型,对应处理方式:

  • 表单提交场景:
    如果你使用Flask-WTF的表单类渲染表单,必须在表单模板中添加{{ form.hidden_tag() }},它会自动插入CSRF token的隐藏输入框。如果是手动编写HTML表单,需手动添加token字段:
    <form method="POST">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
        <!-- 其他表单字段 -->
        <button type="submit">提交</button>
    </form>
    
  • AJAX/API请求场景:
    需要在请求头中携带X-CSRFToken字段,值可通过模板变量{{ csrf_token() }}获取,或者从浏览器Cookie中读取csrf_token(Flask-WTF默认会将token写入Cookie)。示例JS代码:
    fetch('/api/endpoint', {
        method: 'POST',
        headers: {
            'X-CSRFToken': document.cookie.split('; ').find(row => row.startsWith('csrf_token=')).split('=')[1],
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(data)
    });
    
  • 豁免特定路由:
    若某些API接口(如第三方回调、无状态接口)不需要CSRF保护,可使用@csrf.exempt装饰路由:
    from flask import Flask
    from flask_wtf.csrf import CSRFProtect
    
    app = Flask(__name__)
    csrf = CSRFProtect(app)
    
    @csrf.exempt
    @app.route('/webhook', methods=['POST'])
    def webhook():
        # 处理逻辑
        return 'OK'
    

二、解决flask_prometheus_metrics的AttributeError错误

这个问题是因为CSRFProtect的请求拦截逻辑与flask_prometheus_metrics的请求钩子执行顺序冲突导致的,可通过以下方式修复:

  • 调整初始化顺序:
    先初始化flask_prometheus_metrics,再初始化CSRFProtect,确保prometheus的钩子先给Request对象添加_prometheus_metrics_request_start_time属性。示例代码:
    from flask import Flask
    from flask_prometheus_metrics import register_metrics
    from flask_wtf.csrf import CSRFProtect
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'your-secret-key'
    
    # 先初始化prometheus metrics
    register_metrics(app, app_version="v1.0.0", app_config="production")
    
    # 再初始化CSRF保护
    csrf = CSRFProtect(app)
    
  • 检查版本兼容性:
    确认flask-prometheus-metrics、Flask、Flask-WTF的版本是否兼容,可尝试升级到最新稳定版:
    pip install --upgrade flask flask-wtf flask-prometheus-metrics
    
  • 手动补全属性(备选方案):
    如果调整顺序后仍有问题,可在CSRF校验前的请求钩子中手动设置该属性,或者修改prometheus的钩子逻辑,确保属性被正确注入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:45:06