簡體   English   中英

如何在 DRF ModelViewSet 中為單獨的請求方法設置權限?

[英]How can I set permission for seperate request methods in DRF ModelViewSet?

我對 Django 和 Django Rest 框架相當陌生,我不知道為什么我的代碼不起作用。 我有一個 Biz model 有幾個字段:

class Biz(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=200)
    description = models.TextField()
    address = models.CharField(max_length=255, blank=True)
    city = models.CharField(max_length=100)
    phone = PhoneNumberField()

我使用 ModelSerializer 進行序列化:

class BizSerializer(serializers.ModelSerializer):
    class Meta:
        model = Biz
        fields = "__all__"

我使用 ModelViewSet 為其設置一個端點:

class BizViewSet(viewsets.ModelViewSet):
    queryset = Biz.objects.all()
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = [HasGroupPermission]
    required_groups = {
        "GET": ["__all__"],
        "POST": ["member", "biz_post"],
        "PUT": ["member", "biz_edit"],
        "PATCH": ["member", "biz_edit"],
    }

    serializer_class = BizSerializer

您可能注意到HasGroupPermission 這是我確認請求用戶在所需組中的自定義權限,代碼為:

def is_in_group(user, group_name):
    """
    Takes a user and a group name, and returns `True` if the user is in that group.
    """
    try:
        return Group.objects.get(name=group_name).user_set.filter(id=user.id).exists()
    except Group.DoesNotExist:
        return None


class HasGroupPermission(permissions.BasePermission):
    """
    Ensure user is in required groups.
    """

    def has_permission(self, request, view):
        # Get a mapping of methods -> required group.
        required_groups_mapping = getattr(view, "required_groups", {})

        # Determine the required groups for this particular request method.
        required_groups = required_groups_mapping.get(request.method, [])

        # Return True if the user has all the required groups or is staff.
        return all(
            [
                is_in_group(request.user, group_name)
                if group_name != "__all__"
                else True
                for group_name in required_groups
            ]
        ) or (request.user and request.user.is_staff)

但是,當我發出 GET 請求時,權限 function 就像它應該的那樣工作並允許每個人發出請求,當我發出 POST 請求時,權限 function 也可以正常工作(如果用戶不在兩個“成員”中和“biz_post”分組請求被拒絕)。 當我嘗試 PUT、PATCH 和 DELETE 等其他方法時,就會出現問題。 為什么會出現這個問題? 一半的方法有效,而另一半(排序)則無效。 目前我對 DRF 的了解有限,似乎無法解決問題。

我意識到我覺得很愚蠢的問題。 我的 BizViewSet 實際上是一個 ViewSet,我沒有意識到我必須對 object 鏈接(如 localhost:8000/api/biz/$id)發出 PATCH、PUT 和 DELETE 請求。 由於我的用戶序列化程序不是 ViewSet,我認為補丁方法的工作方式與我傳遞 JSON 中的主鍵以及我想要修補的數據的方式相同,但 ViewSet 不同,我不知道。 愚蠢的。

嗨,您可以使用 DjangoModelPermissions 而不是 HasGroupPermission

(首先你必須導入它)

from rest_framework.permissions import DjangoModelPermissions

此權限檢查用戶是否具有 PUT、POST 和 DELETE 權限

所有用戶都有 GET 權限

您必須在管理員中為用戶設置權限或為用戶組設置權限

希望對你有幫助

has_permission方法不提供object-level權限, PUTPATCH需要object-level權限。

您必須創建object-level權限,這些權限僅針對影響特定 object 實例的操作運行,方法是使用permissions.BasePermission class 的has_object_permission方法。

請參閱此鏈接

希望它有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM