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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:10:56