使用Postman请求obtain_auth_token路由出现Django CSRF错误
问题原因
CSRF校验和接口返回的Auth Token是两套完全独立的机制,不存在需要提前持有Token才能请求接口的逻辑。报错是Django默认对所有POST请求启用CSRF校验,未携带合法CSRF凭证的请求会被直接拦截,和DRF的Token认证逻辑无关。
解决方案
- 方案1:给Token获取接口添加CSRF豁免(最常用,适配API客户端调用场景)
在项目的urls.py中用csrf_exempt装饰器包裹obtain_auth_token视图即可,示例代码:
from django.urls import path from rest_framework.authtoken.views import obtain_auth_token from django.views.decorators.csrf import csrf_exempt urlpatterns = [ # 其他路由... path('api-token-auth/', csrf_exempt(obtain_auth_token), name='api_token_auth'), ]
- 方案2:移除全局DRF配置中的SessionAuthentication
如果你的接口不需要支持浏览器端会话登录场景,可以直接在settings.py的DRF配置中删除SessionAuthentication,避免所有DRF视图默认触发CSRF校验:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', # 注释或删除下方的SessionAuthentication配置 # 'rest_framework.authentication.SessionAuthentication', ] }
- 方案3:保留CSRF校验的场景下携带合法凭证
如果接口需要给自家前端页面调用,必须保留CSRF校验,可以按以下规则发起请求:- 先请求任意Django渲染的前端页面,从返回的Cookie中获取
csrftoken值 - 发起POST请求获取Token时,在请求头中添加
X-CSRFToken字段,值为上一步拿到的csrftoken - Postman测试时会自动携带Cookie,只需手动添加对应请求头即可请求成功
- 先请求任意Django渲染的前端页面,从返回的Cookie中获取
内容的提问来源于stack exchange,提问作者PleaseHelp
相关产品推荐
相关产品推荐

