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
相关产品推荐
相关产品推荐

