Django REST Framework中Token认证失效问题求助
哦,我一眼就看到问题所在了!你用的@login_required是Django原生的登录装饰器,它和DRF的Token认证根本不兼容——这个装饰器只认Session认证,完全无视请求头里的Token,所以才会把你跳转到登录表单页面,根本没机会执行后面的视图逻辑。
具体修复步骤
1. 移除@login_required装饰器
DRF已经通过settings.py里的DEFAULT_PERMISSION_CLASSES = ('rest_framework.permissions.IsAuthenticated',)全局设置了权限校验,不需要再叠加Django原生的登录装饰器。移除它之后,DRF会自动用你配置的Token认证来校验请求。
2. 改用DRF标准视图(推荐优化)
你的视图是用普通Django视图写的,虽然能运行,但更推荐用DRF提供的@api_view装饰器或者APIView类,这样能更好地利用DRF的功能:自动处理请求解析、响应格式化,还能省去手动加@csrf_exempt的麻烦(DRF对非Session认证的请求会自动跳过CSRF校验)。
修改后的views.py示例:
from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response @api_view(['GET', 'POST']) @permission_classes([IsAuthenticated]) def ui_list(request): print(request.headers) """ List all code user_informations, or create a new user_information. """ if request.method == "GET": users = UserInformation.objects.all() serializer = UserInformationSerializer(users, many=True) return Response(serializer.data) elif request.method == "POST": serializer = UserInformationSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400)
3. 确认配置有效性
你当前的settings.py里DRF配置是正确的,不需要修改:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ) }
这个配置会让DRF优先尝试Token认证,完全匹配你的需求。
补充说明
之前请求头里明明有Token却失效,核心原因是@login_required在DRF的认证逻辑之前就拦截了请求——它只检查request.user是否通过Django Session认证,完全忽略了请求头里的Token。移除这个装饰器后,DRF的认证中间件才会读取Token并验证用户身份,自然就能返回你想要的REST数据了。
内容的提问来源于stack exchange,提问作者user7849416

