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

