You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:17:43