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

Django REST框架:视图允许匿名与认证用户访问却返回401问题

问题根因

你全局仅配置了TokenAuthentication作为认证类,而该认证类在请求未携带Token时,会直接抛出AuthenticationFailed异常并返回401错误,流程根本走不到AllowAny权限类的校验环节。

解决方案

提供两种可行方案,按需选择:

方案一:修改全局认证配置

在settings.py的REST_FRAMEWORK中添加SessionAuthentication(适配使用Django session认证的项目),这样当请求无Token时,Session认证会返回匿名用户,而非直接报错:

REST_FRAMEWORK = {
    'DATETIME_FORMAT': "%c",
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',  # 新增该行
    ],
}

方案二:视图内自定义认证规则

若不想改动全局配置,可在目标视图中使用自定义的“可选Token认证类”——无Token时不抛出异常,直接返回匿名用户:
先编写自定义认证类:

from rest_framework.authentication import TokenAuthentication
from rest_framework.exceptions import AuthenticationFailed

class OptionalTokenAuthentication(TokenAuthentication):
    def authenticate(self, request):
        try:
            # 尝试Token认证
            return super().authenticate(request)
        except AuthenticationFailed:
            # 无Token时返回None,让request.user变为AnonymousUser
            return None

再在视图中配置该认证类:

class CourseListView(generics.ListAPIView):
    permission_classes = [AllowAny, ]
    authentication_classes = [OptionalTokenAuthentication, ]  # 使用自定义认证类

    def list(self, request, format=None):
        user = request.user
        realUserFlag = not user.is_anonymous
        ...

调整后,匿名用户访问时认证流程不会报错,request.user会被设为AnonymousUser,AllowAny权限类会正常允许访问,你也能通过user.is_anonymous区分用户类型执行不同逻辑。

内容的提问来源于stack exchange,提问作者AlwaysLearning

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:52:19