Django REST Framework权限类无法获取请求Token头问题求助
解决Django REST Framework权限类无法获取Token头的问题
问题根源
前端发送自定义Token头时,浏览器会先发起OPTIONS预检请求,该请求不会携带Token信息。你的权限类在处理OPTIONS请求时依然执行校验逻辑,导致检测不到Token而拒绝访问;同时如果跨域配置未允许自定义Token头,也会导致Django无法正确接收该头信息。
修复步骤
1. 修改权限类,放行OPTIONS预检请求
更新StaffOnly权限类,优先处理OPTIONS请求,直接返回True跳过校验:
from rest_framework import permissions from rest_framework.exceptions import PermissionDenied from .models import CustomUser class StaffOnly(permissions.BasePermission): def has_permission(self, request, view): # 放行OPTIONS预检请求 if request.method == 'OPTIONS': return True token = request.META.get('HTTP_TOKEN') # 先判断Token是否存在 if not token: raise PermissionDenied('No token') # 简化用户查询逻辑 user = CustomUser.objects.filter(token=token).first() if not user: raise PermissionDenied('Invalid token') return user.role > 0
2. 配置跨域允许自定义Token头
如果使用django-cors-headers处理跨域,在项目settings.py中添加Token到允许的请求头列表:
CORS_ALLOW_HEADERS = [ "accept", "accept-encoding", "authorization", "content-type", "dnt", "origin", "user-agent", "x-csrftoken", "x-requested-with", # 添加自定义Token头 "token", ]
3. 验证请求头的正确性
确保前端发送的Token头名称与后端接收的一致:前端用"Token",后端request.META中对应HTTP_TOKEN(Django会自动将请求头转为大写并添加HTTP_前缀,比如Token→HTTP_TOKEN,X-Token→HTTP_X_TOKEN)。
验证方法
修改完成后重启Django服务,前端发起请求时,OPTIONS预检请求会被权限类放行,后续的GET请求携带的Token头可被正常获取并校验。
内容的提问来源于stack exchange,提问作者Egor
相关产品推荐
相关产品推荐

