如何在Django REST Framework中仅对指定API视图方法禁用CSRF
在DRF中仅针对单个API方法禁用CSRF防护
嘿,刚好碰到过类似的需求!在Django REST Framework里要单独给某个API视图方法禁用CSRF防护,分几种场景给你说清楚:
1. 函数式API视图
如果你的API是用@api_view装饰的函数视图,直接把csrf_exempt装饰器放在最外层就行,确保它包裹住api_view的装饰:
from django.views.decorators.csrf import csrf_exempt from rest_framework.decorators import api_view from rest_framework.response import Response @csrf_exempt @api_view(['POST']) def unprotected_post_api(request): # 这里写你的接口逻辑,比如处理第三方服务的回调 return Response({"status": "success", "message": "该POST接口已禁用CSRF防护"})
2. 类视图(APIView子类)
如果是类视图,想要给特定的HTTP方法(比如POST、PUT)禁用CSRF,用method_decorator把csrf_exempt绑定到对应的方法上就好:
from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from rest_framework.views import APIView from rest_framework.response import Response class MixedProtectionView(APIView): # GET请求默认不受CSRF防护,这里正常处理 def get(self, request): return Response({"message": "GET请求无需CSRF验证"}) # 仅给POST方法禁用CSRF @method_decorator(csrf_exempt) def post(self, request): return Response({"message": "该POST接口已禁用CSRF防护"})
3. ViewSet中的自定义Action
如果用了ViewSet,想给某个自定义action禁用CSRF,同样结合method_decorator和@action装饰器:
from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from rest_framework import viewsets from rest_framework.response import Response class MyViewSet(viewsets.ViewSet): # 默认的list方法受CSRF防护(如果是session认证的话) def list(self, request): return Response({"message": "常规list接口受CSRF保护"}) # 仅给这个自定义action禁用CSRF @method_decorator(csrf_exempt) @action(detail=False, methods=['post']) def external_webhook(self, request): # 处理第三方Webhook回调的逻辑 return Response({"status": "webhook received"})
重要提醒
- 只有当你的API是给无session的客户端(比如第三方服务、纯API调用的移动端)使用时,才需要禁用CSRF。如果是基于session的前端(比如Vue/React和Django同域),尽量不要随便禁用,CSRF防护是重要的安全措施。
- DRF中,使用Token认证、JWT认证等无session的认证方式时,本来就不会触发CSRF验证,这时候不需要额外做什么。
内容的提问来源于stack exchange,提问作者Roman Alexandrovich
相关产品推荐
相关产品推荐

