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

本地Django处理Stripe Webhook时CSRF未设置导致403错误的排查与解决

原因分析
  1. @csrf_exempt装饰器未生效:
    • 装饰器顺序错误,被其他装饰器(如@login_required)覆盖;
    • 导入错误,未正确引入django.views.decorators.csrf.csrf_exempt;
  2. 中间件干扰:CsrfViewMiddleware配置异常,或存在自定义中间件强制检查CSRF;
  3. 本地代理工具问题:使用ngrok等工具转发请求时,请求头被修改,导致Django无法识别CSRF豁免设置。

解决方法

1. 确保@csrf_exempt正确配置

  • 检查导入语句:
    from django.views.decorators.csrf import csrf_exempt
    
  • 让@csrf_exempt成为视图的最外层装饰器,其他装饰器放在它下方:
    @csrf_exempt
    def stripe_webhook(request):
        # 视图代码
    

2. 验证CSRF豁免状态

在视图开头添加调试代码,确认Django是否识别到豁免:

@csrf_exempt
def stripe_webhook(request):
    print(f"CSRF Exempt: {hasattr(request, '_csrf_exempt')}")
    # 原有代码...

如果输出False,说明装饰器未生效,需排查装饰器顺序或导入问题。

3. 检查中间件配置

在settings.py中确认CsrfViewMiddleware的位置正常,无自定义中间件干扰:

MIDDLEWARE = [
    # 其他中间件...
    'django.middleware.csrf.CsrfViewMiddleware',
    # 其他中间件...
]

4. 本地测试注意事项

  • 使用ngrok时,确保请求直接转发到Django服务器,无额外代理修改请求头;
  • Stripe Webhook请求不会携带Django CSRF Cookie,必须通过@csrf_exempt豁免该端点,这是第三方Webhook的标准处理方式。

5. 手动豁免CSRF(备选方案)

如果装饰器始终无效,可在视图内部手动设置豁免:

def stripe_webhook(request):
    request._csrf_exempt = True
    # 原有代码...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:02:33