![](/img/trans.png)
[英]How can I set permission for seperate request methods in DRF ModelViewSet?
[英]How can custom values be passed from a DRF ModelViewSet to a permissions class?
我已經設置了一個自定義權限 class以從多個視圖中重用,在一個應用程序中,一些用戶代表其他用戶擁有類似所有權的權限:
class IsOwnerLike(permissions.BasePermission):
def has_permission(self, request, view):
if (
user_is_owner(request.user, request.data["owned_by"])
| user_is_owner_like(request.user, request.data["owned_by"])
):
return True
return False
對於一個 ModelViewSet,這可以按預期工作。
但是,由於遺留原因,進入不同視圖的不同請求可能沒有“owned_by”數據元素——它可能被稱為“owned”、“owner”、“created_by”等——因此我不能重用此自定義權限。
在視圖集中抽象事物、規范傳遞給我的自定義權限 class 的數據的正確方法是什么? 可以這樣做,還是我應該考慮以不同的方式處理這些權限?
找到了解決辦法。
我能夠向視圖添加自定義屬性:
class ViewOne(ModelViewSet):
ownership_fieldname = "owned_by"
permission_classes = [IsOwnerLike]
...
class ViewTwo(ModelViewSet):
ownership_fieldname = "owner"
permission_classes = [IsOwnerLike]
...
然后在權限中訪問它:
class IsOwnerLike(permissions.BasePermission):
def has_permission(self, request, view):
if (
user_is_owner(request.user, request.data[view.ownership_fieldname])
| user_is_owner_like(request.user, request.data[view.ownership_fieldname])
):
return True
return False
您應該從 has_object_permission 使用 object 檢查 model 訪問權限,如下所示:
def has_object_permission(self, request, view, obj):
if hasattr(obj, 'owner'):
if obj.user == request.user:
return True
return False
您可以使用模型所有者字段名稱更改所有者
對於將所有者 kwargs 傳遞給權限 class 您應該從 ModelViewSet 編寫 custommModelViewSet 和 inheritance 並覆蓋 get_permissions() 方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.