【问题标题】:custom message in raise PermissionDenied not working in Django restraise PermissionDenied 中的自定义消息在 Django rest 中不起作用
【发布时间】:2021-11-18 18:59:39
【问题描述】:

我在自定义权限函数中尝试 raise PermissionDenied("Anonymous user") 但我写的消息没有显示在 api 响应中。相反,它会显示默认的禁止消息,即您无权执行此操作

我的 sn-p 在这里:

class CustomPermission(BasePermission):
    """
        returns permission based on the request method and slug
    """

    def has_permission(self, request,view):
        slug = request.resolver_match.kwargs["slug"]
        if slug is not None and request.method == 'POST':
            if slug == "abc":
                user = request.user
                if user.is_staff:
                    return True
                if user.is_anonymous:
                    print("iam here")
                    raise PermissionDenied("Anonymous user")
            elif slug == "mnp":
                return True
        else:
            return True

在上面的代码中,我到达了(“iam here”),但匿名用户没有打印,而是显示默认消息。

【问题讨论】:

    标签: django api django-rest-framework permissions django-permissions


    【解决方案1】:

    您可以在消息属性中更改错误消息:

    from rest_framework import permissions
    
    
    class CustomerAccessPermission(permissions.BasePermission):
        message = 'Your message'
    
        def has_permission(self, request, view): 
            ... # return True or False
    

    文档在:https://www.django-rest-framework.org/api-guide/permissions/#custom-permissions

    之后,您视图中的permission_denied(self, request, message=None, code=None) 函数将被调用,其中message 是您在权限类中声明的属性。

    您可以使用它,甚至传递另一条消息:

    from rest_framework.exceptions import PermissionDenied
    
    
    class YourView(...):
        permission_classes = [CustomerAccessPermission]
    
        def permission_denied(self, request, message=None, code=None):
            raise PermissionDenied(message)
    

    【讨论】:

    • 我确实像你说的那样只是返回 false,但是 cusotm 消息没有进来,而是相同的默认禁止消息
    • 对不起!我已经更新了我的答案@Django-Rocks
    • 我又做了一次,但仍然有效。我尝试将消息放入 permission_denied(self, request, message=None, code=None): 和 CustomerAccessPermission(permissions.BasePermission): 类中,但仍然不起作用
    • 这很奇怪,因为它对我有用!您使用的是什么版本的 DRF?并注意从 DRF 导入 PermissionDenied 而不是从 django @Django-Rocks
    猜你喜欢
    • 2014-10-12
    • 2019-12-16
    • 2014-07-14
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多