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

Django REST Framework匿名访问返回500而非401问题求助

解决DRF匿名请求返回500而非401的问题

从你的错误栈能直接定位核心问题:自定义权限类执行时抛出了未处理的异常,导致DRF返回500错误,而没有触发IsAuthenticated权限本该返回的401。

具体来说,在/qr/qr/permissions.py第39行,你直接用request.user查询CustomUser:

user_company = str(CustomUser.objects.get(user=request.user).seat.company.id)

当匿名用户请求时,request.user是AnonymousUser对象,并非合法的User实例。Django尝试把这个对象转换为用户ID整数时,就抛出了TypeError: int() argument must be a string, a bytes-like object or a number, not 'AnonymousUser',这个未捕获的异常直接导致了500错误。

要解决这个问题,你需要修改自定义权限类,确保先验证用户已认证,再执行依赖于认证用户的逻辑,同时捕获可能的查询异常:

方案1:继承IsAuthenticated权限类

让自定义权限类继承IsAuthenticated,这样会先执行父类的认证检查,只有用户通过认证后,才会执行你的自定义逻辑:

from rest_framework.permissions import IsAuthenticated, BasePermission
from .models import CustomUser

class YourCustomPermission(IsAuthenticated):
    def has_permission(self, request, view):
        # 先调用父类方法,确保用户已认证
        if not super().has_permission(request, view):
            return False
        
        # 此时request.user是合法认证用户,执行自定义逻辑
        try:
            # 捕获CustomUser不存在的情况,避免抛出异常
            custom_user = CustomUser.objects.get(user=request.user)
            user_company = str(custom_user.seat.company.id)
            # 这里添加你的权限判断逻辑(比如对比公司ID等)
            # ...
            return True
        except CustomUser.DoesNotExist:
            # 用户无关联CustomUser记录,返回False触发403
            return False

方案2:手动检查用户认证状态

如果不想继承IsAuthenticated,可以在自定义权限开头手动检查用户认证状态:

from rest_framework.permissions import BasePermission
from .models import CustomUser

class YourCustomPermission(BasePermission):
    def has_permission(self, request, view):
        # 第一步:检查用户是否已认证
        if not request.user.is_authenticated:
            return False
        
        # 第二步:执行自定义权限逻辑
        try:
            custom_user = CustomUser.objects.get(user=request.user)
            user_company = str(custom_user.seat.company.id)
            # 你的权限判断逻辑
            # ...
            return True
        except CustomUser.DoesNotExist:
            return False

为什么这样能解决问题?

  • 匿名用户请求时,IsAuthenticated(或手动检查request.user.is_authenticated)会返回False,DRF会立即返回401 Unauthorized,不会执行后续自定义逻辑,也就不会触发TypeError。
  • 捕获CustomUser.DoesNotExist异常可以避免另一种潜在的500错误(比如认证用户无关联CustomUser记录),让权限类返回False,触发403 Forbidden。

最后,确保视图使用修复后的权限类,或者在settings.py的DEFAULT_PERMISSION_CLASSES中正确配置权限顺序(如果同时使用多个权限类,IsAuthenticated应放在前面)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:09:25