[英]Django Rest Framework permissions of POST object
我正在為使用HyperlinkeRelatedFields等的超鏈接序列化程序實現自定義權限類。
該檢查非常粗略:
def has_permission(self, request,view):
if request.method in permissions.SAFE_METHODS:
return True
if not request.user.is_authenticated():
return False
if request.user.is_staff:
return True
# POST: 'author' is a URL due to serializer being Hyperlinked
# meaning we have to translate URL to model (like the serializer)
# to perform the check
if url_to_user(request.DATA['author']) == request.user:
return True
給定代碼中的注釋,似乎最好讓序列化程序在驗證期間執行此檢查,盡管這樣做會轉移關注點。 幾乎就像驗證類需要在調用save()之前在其上傳遞新對象的方法以從權限的角度檢查POST / PUT是否可接受,而不是將HTTP /權限相關的檢查插入到驗證中序列化器。
url_to_user是序列化特定的,並且序列化程序的驗證器部分中的檢查將是請求/ http特定的,而不僅僅是新模型的完整性/完整性檢查。
這樣做似乎很普通,所以我很好奇其他人采取的路線,如果缺少“更正確”的方法,我會很想念。
提前致謝。
鑒於注釋為POST
,我將假定這只是您正在處理的新對象的創建。
由於author
必須是request.user
因此無需將其作為可寫字段。 我只是在pre_save
對象的author屬性設置為當前用戶。
同樣,如果要處理PUT
也可以將QuerySet
限制為當前用戶:
def get_queryset(self):
return MyClass.objects.filter(author=self.request.user)
(查看request.method in permissions.SAFE_METHODS
中的request.method in permissions.SAFE_METHODS
您可能需要根據請求方法執行此操作...)
這樣,用戶無法創建未附加到自己的對象,也無法更新他們尚未擁有的對象。
但是,與以往一樣, TIMTOWTDI ; 基於權限的路由沒有任何問題。 (我不確定這里是否有最終答案。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.