每种方法分开的权限

我正在使用Django REST框架编写一个API,我想知道是否可以在使用基于类的视图时为每个方法指定权限。

如果您正在编写基于功能的视图,阅读我所看到的文档非常容易,只需使用@permission_classes修饰器来覆盖要使用权限保护的视图的功能。 但是,在使用CBV和APIView类时,我没有看到相同的方法,因为那时我使用permission_classes属性指定了完整类的permission_classes ,但是这将应用于所有类方法( getpostput ...)。

那么,是否有可能使用CBV编写API视图,并为视图类的每种方法指定不同的权限?


权限适用于整个View类,但您可以在授权决策中考虑请求的各个方面(如GET或POST等方法)。

以内置的IsAuthenticatedOrReadOnly为例:

SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS']

class IsAuthenticatedOrReadOnly(BasePermission):
    """
    The request is authenticated as a user, or is a read-only request.
    """

    def has_permission(self, request, view):
        if (request.method in SAFE_METHODS or
            request.user and
            request.user.is_authenticated()):
            return True
        return False

我在使用CBV时遇到了同样的问题,因为根据请求方法我有相当复杂的权限逻辑。

我想出的解决方案是使用本页底部列出的第三方'rest_condition'应用程序

http://www.django-rest-framework.org/api-guide/permissions

https://github.com/caxap/rest_condition

我只是将权限流逻辑分开,以便每个分支都可以运行,具体取决于请求方法。

from rest_condition import And, Or, Not

class MyClassBasedView(APIView):

    permission_classes = [Or(And(IsReadOnlyRequest, IsAllowedRetrieveThis, IsAllowedRetrieveThat),
                             And(IsPostRequest, IsAllowedToCreateThis, ...),
                             And(IsPutPatchRequest, ...),
                             And(IsDeleteRequest, ...)]

因此'Or'决定了哪个分支应该运行,具体取决于请求方法,而'And'包装与接受的请求方法相关的权限,因此所有的权限都必须通过才能被授予。 您还可以在每个流程中混合使用“或”,“和”和“不”,以创建更复杂的权限。

运行每个分支的权限类只是看起来像这样,

class IsReadyOnlyRequest(permissions.BasePermission):

    def has_permission(self, request, view):
        return request.method in permissions.SAFE_METHODS


class IsPostRequest(permissions.BasePermission):

    def has_permission(self, request, view):
        return request.method == "POST"


... #You get the idea
链接地址: http://www.djcxy.com/p/69093.html

上一篇: Separate permissions per methods

下一篇: Get Mako template from within Pyramid app view