在使用基于类的视图时,我遇到了同样的问题,因为我的权限逻辑相当复杂,取决于请求方法。
我想出的解决办法是使用第三方的'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'包装与接受的请求方法相关的权限,因此所有权限必须通过才能授予权限。您还可以在每个流程中混合使用'Or'、'And'和'Not'以创建更复杂的权限。
要运行每个分支的权限类只需像这样:
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"
...