每种方法分开的权限
我正在使用Django REST框架编写一个API,我想知道是否可以在使用基于类的视图时为每个方法指定权限。
如果您正在编写基于功能的视图,阅读我所看到的文档非常容易,只需使用@permission_classes
修饰器来覆盖要使用权限保护的视图的功能。 但是,在使用CBV和APIView
类时,我没有看到相同的方法,因为那时我使用permission_classes
属性指定了完整类的permission_classes
,但是这将应用于所有类方法( get
, post
, put
...)。
那么,是否有可能使用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