[英]How can custom values be passed from a DRF ModelViewSet to a permissions class?
[英]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
權限, PUT
和PATCH
需要object-level
權限。
您必須創建object-level
權限,這些權限僅針對影響特定 object 實例的操作運行,方法是使用permissions.BasePermission
class 的has_object_permission
方法。
請參閱此鏈接。
希望它有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.