Django Webhook标记csrf_exempt仍返回403 Forbidden求助
解决Django Webhook接口POST返回403 Forbidden的问题
嘿,我立刻就发现了你的代码里的关键问题,另外也给你补充几个可能的排查方向:
1. 最直接的错误:父类名称写错了
你的视图类是MailView,但在dispatch方法里调用super()的时候却写了MailTrackingView——这会导致你覆盖的dispatch方法根本没有正确继承父类的逻辑,@csrf_exempt装饰器自然也就没生效!
修正后的views.py代码应该是这样:
from django.views.decorators.csrf import csrf_exempt from django.views import View from django.http import HttpResponse class MailView(View): @csrf_exempt def dispatch(self, *args, **kwargs): # 这里要改成和类名一致的MailView return super(MailView, self).dispatch(*args, **kwargs) def post(self, request, *args, **kwargs): return HttpResponse(status=204)
2. 另一种更清晰的写法:用method_decorator装饰类
如果你觉得在dispatch上写装饰器有点麻烦,也可以直接给整个视图类加上csrf_exempt装饰,这样代码更直观:
from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator from django.views import View from django.http import HttpResponse @method_decorator(csrf_exempt, name='dispatch') class MailView(View): def post(self, request, *args, **kwargs): return HttpResponse(status=204)
3. 排查中间件配置
如果上面的修正后还是有问题,去检查你的settings.py里的MIDDLEWARE配置:
- 确保
django.middleware.csrf.CsrfViewMiddleware确实存在(不过一般默认是有的) - 如果你在中间件里自定义了其他处理请求的逻辑,确认没有额外添加CSRF验证的规则
4. 确认请求的正确性
- 确保你发送的确实是POST请求,而不是其他方法(比如GET)
- 有些第三方Webhook工具可能会带特殊的请求头,你可以在
post方法里先打印request.META看看请求的详细信息,确认没有被其他逻辑拦截
内容的提问来源于stack exchange,提问作者wasp256
相关产品推荐
相关产品推荐

