Djoser UserViewSet的list接口返回401未授权问题求助
核心原因分析
1. 全局权限策略强制要求认证
你的config.settings.py中,REST Framework的全局权限配置默认要求所有接口必须是已认证用户才能访问:
REST_FRAMEWORK = { "DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.IsAuthenticated"], # ...其他配置 }
这个配置会作用于所有未单独指定权限的视图,包括你定义的UserCreateView的list方法。
2. 视图未单独开放匿名访问权限
UserCreateView继承自Djoser的UserViewSet,而Djoser的UserViewSet默认继承全局权限策略,没有为list方法单独设置允许匿名访问的权限。你只重写了create方法,没有修改list方法的权限控制。
3. 请求未携带有效认证凭证
如果你本就打算让该接口需要认证后访问,那401错误的直接原因就是Postman请求时没有正确携带Token:
- 未在请求头中添加
Authorization字段,格式应为Token <你的认证Token> - 使用的Token无效、过期,或者属于未激活的用户
针对性解决办法
场景一:允许匿名用户访问用户列表
如果需要开放这个接口给未登录用户,有两种常用方式:
方式1:在视图中为list方法单独设置权限
修改accounts.views.py中的UserCreateView,添加权限配置:
from rest_framework.permissions import AllowAny class UserCreateView(UserViewSet): serializer_class = UserCreateSerializer # 为list方法单独设置允许匿名访问 def get_permissions(self): if self.action == 'list': return [AllowAny()] return super().get_permissions() # ...你的create方法代码
方式2:在URL配置中指定权限
修改config.urls.py的URL路径,直接添加权限类:
from rest_framework.permissions import AllowAny from rest_framework.decorators import permission_classes urlpatterns = [ path( "api/v1/users/", permission_classes([AllowAny()])(UserCreateView.as_view({"get": "list"})), name="user-create" ), # ...其他URL ]
场景二:保持接口需要认证访问
如果这个接口本就应该只对已登录用户开放,需要完成以下步骤:
- 获取认证Token:调用Djoser的登录接口
POST api/v1/auth/token/login/,传入用户的email和password,接口会返回auth_token字段。 - 在Postman中添加认证头:在请求的Headers中添加键值对:
- 键:
Authorization - 值:
Token <获取到的auth_token值>
- 键:
额外代码问题提示
你的UserCreateView的create方法最后一行存在变量未定义问题:
return Response(data, status=status.HTTP_201_CREATED)
这里的data没有被定义,建议修改为返回用户序列化数据或者自定义响应内容,比如:
return Response(user_serializer.data, status=status.HTTP_201_CREATED)
内容的提问来源于stack exchange,提问作者juanl4zy
相关产品推荐
相关产品推荐

