如何在REST fram中获取或权限而不是和

2024-05-14 18:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

在REST框架检查权限时,权限类似乎是与的。这是每个权限类需要返回True才能授予权限。这使得“如果你是超级用户,你可以访问任何东西,但是如果你是一个普通用户,你需要显式的权限”这样的东西很难实现,你不能只返回False,它会使整个堆栈失败。有没有办法让权限短路?比如“如果这个许可被授予,停止检查?”或者其他处理类似案件的方法?在


Tags: 方法用户框架restfalsetrue权限堆栈
3条回答

现在,DRF允许使用按位运算符组合权限:和-和|-或-。在

From the docs

Provided they inherit from rest_framework.permissions.BasePermission, permissions can be composed using standard Python bitwise operators. For example, IsAuthenticatedOrReadOnly could be written:

from rest_framework.permissions import BasePermission, IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

class ReadOnly(BasePermission):
    def has_permission(self, request, view):
        return request.method in SAFE_METHODS

class ExampleView(APIView):
    permission_classes = (IsAuthenticated|ReadOnly,)

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)

编辑:请注意IsAuthenticated|ReadOnly后面有一个逗号。在

您需要按照文档中的描述构建自己的custom http://www.django-rest-framework.org/api-guide/permissions/#custom-permissions。在

比如:

from rest_framework import permissions

class IsAdminOrStaff(permissions.BasePermission):
    message = 'None of permissions requirements fulfilled.'

    def has_permission(self, request, view):
        return request.user.is_admin() or request.user.is_staff()

那么在你看来:

^{pr2}$

我想你可以在这里使用django-rules库。Link

它是一个与决策树非常相似的基于规则的引擎,可以很容易地与DRF的权限类框架集成。在

最棒的是,您可以对简单权限执行设置操作,并从中创建复杂权限。在

示例

>>> @rules.predicate
>>> def is_admin(user):
...     return user.is_staff 
...


>>> @rules.predicate
>>> def is_object_owner(user, object):
        return object.owner == user

谓词可以对给定参数执行几乎任何操作,但如果检查的条件为True,则必须始终返回True,否则返回False。 现在组合这两个谓词。。在

^{pr2}$

您可以在权限类的has\u permissions方法中使用这个新的谓词规则is_object_editable。在

相关问题 更多 >

    热门问题