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

DRF自定义权限类无法返回自定义权限拒绝消息问题排查

DRF自定义权限类的自定义拒绝消息不生效问题排查

问题描述

在Django REST Framework(DRF)中编写了自定义权限类IsAuthenticatedAndIsLr,期望返回自定义的权限拒绝消息,但实际返回默认的权限拒绝消息。相关代码如下:

自定义权限类代码

class IsAuthenticatedAndIsLr(BasePermission):
    
    def has_permission(self, request, view):
        
        message = "user is not LR"
        
        return request.user.is_authenticated and  request.user.regd_as == "LR"

API使用代码

@api_view(['POST'])
@permission_classes([IsAuthenticatedAndIsLr])
def create_profile(request):
    '''
    this api creates profile for users based
    on their choosen category.
    '''
    
    data = request.data
    
    model_dict = {
        'IND'
    }
    
    try:
      ...
      
      return Response({'message': f'{request.user} isLR'}, status= status.HTTP_201_CREATED)
    
    except Exception as e:
      
      return Response({"message": str(e)}, status= status.HTTP_500_INTERNAL_SERVER_ERROR)

已按照官方文档方式设置,但自定义消息未生效,求排查原因。


问题原因及解决方法

问题出在你自定义的message是方法内部的局部变量,DRF的权限系统无法识别这个变量作为权限拒绝的提示信息。DRF要求自定义权限消息必须是权限类的类属性,或者在校验失败时给实例的message属性赋值。

修复方案1:定义类属性message

直接在权限类中声明message为类变量,这是最简单的方式:

class IsAuthenticatedAndIsLr(BasePermission):
    message = "user is not LR"  # 声明为类属性
    
    def has_permission(self, request, view):
        return request.user.is_authenticated and request.user.regd_as == "LR"

修复方案2:动态赋值实例属性(支持多场景消息)

如果需要根据不同的校验失败原因返回不同的提示消息,可以在方法内给self.message赋值:

class IsAuthenticatedAndIsLr(BasePermission):
    
    def has_permission(self, request, view):
        if not request.user.is_authenticated:
            self.message = "用户未登录"
            return False
        if request.user.regd_as != "LR":
            self.message = "user is not LR"
            return False
        return True

修改后,权限校验失败时就会返回你自定义的消息了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:49:56