Django REST Framework中CreateModelMixin出现CSRF验证失败如何解决
问题原因
Django默认对所有POST请求开启CSRF(跨站请求伪造)防护校验,你使用Postman发起注册请求时未携带合法的CSRF令牌,因此触发403错误。
解决方案(任选其一即可让现有代码正常运行)
提示:CSRF豁免仅推荐在本地测试阶段使用,如果你的生产环境使用Session身份认证,请不要全局关闭CSRF校验。
方案1:给注册视图添加CSRF豁免(最快捷,适配Postman测试场景)
修改你的视图代码,导入装饰器后给类视图添加CSRF豁免标记,修改后代码如下:
from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator from rest_framework import generics, mixins from .serializers import RegistrationSerializer @method_decorator(csrf_exempt, name='dispatch') class UserRegistration(mixins.CreateModelMixin, generics.GenericAPIView): serializer_class = RegistrationSerializer def post(self, request, *args, **kwargs): return super().create(request, *args, **kwargs)
方案2:Postman请求携带CSRF令牌(不关闭安全校验的选择)
- 先用Postman发起一次GET请求,访问你的Django服务任意可正常返回的地址,从响应的
Set-Cookie头中获取csrftoken对应的值 - 发起注册POST请求时,添加两个请求参数:
- 请求头新增
X-CSRFToken字段,值为刚才获取的csrftoken - 请求的Cookie中添加
csrftoken=刚才获取的csrftoken
- 请求头新增
方案3:调整DRF全局认证配置(适配纯API无session场景)
如果你的接口都是前后端分离的无状态API,不需要使用Session登录,可以修改settings.py中的DRF配置,移除SessionAuthentication即可默认关闭CSRF校验:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ # 注释或删除下面这行即可 # 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', # 按需保留其他认证类 ] }
内容的提问来源于stack exchange,提问作者Atharva
相关产品推荐
相关产品推荐

