Django REST Framework有效凭证请求返回401错误排查求助
问题分析与解决方案
问题根源
你遇到的401 Invalid token错误,是因为全局配置的TokenAuthentication被应用到了DRF自带的obtain_auth_token视图上。这个视图的作用是通过用户名密码获取Token,但全局认证规则会先检查请求中是否携带合法Token——而你发起请求时只传了用户名密码,没有Token,因此被拦截返回错误。
而Djoser的auth/token/login端点能正常工作,是因为Djoser内部已经为该视图配置了允许匿名访问的权限,不会强制要求请求携带Token。
解决方案
你可以通过自定义获取Token的视图,绕过全局认证规则,让该接口允许匿名访问:
步骤1:自定义认证视图
在restaurant/views.py中添加以下代码:
from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.authtoken.models import Token from rest_framework.response import Response from rest_framework import permissions class CustomAuthToken(ObtainAuthToken): # 允许匿名用户访问该接口 permission_classes = [permissions.AllowAny] def post(self, request, *args, **kwargs): serializer = self.serializer_class(data=request.data, context={'request': request}) serializer.is_valid(raise_exception=True) user = serializer.validated_data['user'] token, created = Token.objects.get_or_create(user=user) return Response({'token': token.key})
步骤2:更新应用级URL配置
修改restaurant/urls.py,替换原来的obtain_auth_token引用:
from django.urls import path from . import views # 替换原导入,改用自定义视图 from .views import CustomAuthToken urlpatterns = [ path('home/', views.index, name='index'), path('menu/', views.MenuItemView.as_view()), path('menu/<int:pk>', views.SingleMenuItemView.as_view()), path('api-token-auth/', CustomAuthToken.as_view()) ]
验证请求
确保你的POST请求满足以下要求:
- 请求头
Content-Type设置为application/json - 请求体携带正确的
username和password字段:{ "username": "你的用户名", "password": "你的密码" }
这样修改后,restaurant/api-token-auth端点就能正常通过用户名密码返回Token了。
内容的提问来源于stack exchange,提问作者f4r3
相关产品推荐
相关产品推荐

