每个视图的Django Rest Framework自定义权限

use*_*859 3 permissions django-rest-framework

我想基于视图+方法+用户权限在Django Rest Framework中创建权限。

有没有一种方法可以实现,而无需手动写入每个权限并检查用户所在组的权限?

另外,我面临的另一个问题是,权限对象与特定模型捆绑在一起。由于我有影响不同模型的视图,或者我想对方法PUT授予不同的权限,具体取决于我访问的视图(因为它影响不同的字段),因此我希望将权限绑定到某个视图,而不是某种模式。

有人知道该怎么做吗?

我正在寻找以下解决方案:

1)使用以下参数创建一个Permissions对象:View_affected,list_of_allowed_methods(GET,POST等)

2)创建具有该权限关联的Group对象

3)将用户添加到组

4)让我的默认权限类别负责所有工作。

从现在开始,给我带来麻烦的步骤是步骤1。因为我看不到将View与Permission绑定的方法,并且因为Permissions需要一个模型,所以我不想要一个模型。

任何帮助将不胜感激!

om2*_*0de 6

可以通过这种方式创建自定义权限,更多信息在官方文档(https://www.django-rest-framework.org/api-guide/permissions/):

from rest_framework.permissions import BasePermission


# Custom permission for users with "is_active" = True.
class IsActive(BasePermission):
    """
    Allows access only to "is_active" users.
    """
    def has_permission(self, request, view):
        return request.user and request.user.is_active

# Usage
from rest_framework.views import APIView
from rest_framework.response import Response

from .permissions import IsActive   # Path to our custom permission

class ExampleView(APIView):
    permission_classes = (IsActive,)

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


小智 5

好吧,使用DRF可以轻松完成第一步。请参阅http://www.django-rest-framework.org/api-guide/permissions#custom-permissions

您必须执行以下操作:

from functools import partial

from rest_framework import permissions

class MyPermission(permissions.BasePermission):

    def __init__(self, allowed_methods):
        super().__init__()
        self.allowed_methods = allowed_methods

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


class ExampleView(APIView):
    permission_classes = (partial(MyPermission, ['GET', 'HEAD']),)
Run Code Online (Sandbox Code Playgroud)