为何ModelViewSet无法覆盖DEFAULT_PERMISSION_CLASSES等默认配置?
解决ModelViewSet公开访问覆盖默认认证无效的问题
你遇到的问题是全局默认要求用户认证,但在ModelViewSet中设置permission_classes = [AllowAny]和空authentication_classes后,仍返回{"detail": "Authentication credentials were not provided."}错误,具体原因和解决方法如下:
问题根源
DRF的执行逻辑是先完成认证流程,再做权限校验。你设置authentication_classes = ([])的写法虽语法合法,但完全没必要清空认证类——当权限类设为AllowAny时,即便默认认证类(比如JWT)尝试校验凭证,只要权限校验通过,就会允许未认证用户访问,不会触发401错误。反而错误设置空认证类可能导致DRF的认证流程出现异常判断,触发默认认证的报错。
正确解决方案
修改ToolsListViewSet,仅保留permission_classes = [AllowAny],移除authentication_classes的多余设置即可:
class ToolsListViewSet(viewsets.ModelViewSet): serializer_class = ToolsListSerializer permission_classes = [AllowAny] # 仅这一行就可实现公开访问 pagination_class = None def get_queryset(self): return Tools.objects.filter(is_active=True)
额外说明
如果确实需要完全跳过认证流程(连凭证检查都不想执行),可规范设置空认证类列表:
authentication_classes = [] # 直接用空列表,无需额外括号包裹
修改后,该视图集的所有接口将公开访问,不再要求认证凭证。
内容的提问来源于stack exchange,提问作者urek mazino
相关产品推荐
相关产品推荐

