我正在为超链接序列化程序实现一个自定义权限类,该序列化程序使用超链接相关字段等。在
支票非常粗略:
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
考虑到代码中的注释,似乎最好让序列化程序在验证期间执行此检查,尽管这会转移关注点。就像validation类需要在调用save()之前传递给新对象的方法,从权限的角度检查POST/PUT是否可接受,而不是将HTTP/权限相关的检查塞入序列化程序中的验证。在
url“到”user是特定于序列化的,序列化程序的验证器部分的检查将是特定于请求/http的,而不仅仅是新模型的健全性/完整性检查。在
这似乎是一件很平常的事,我很好奇别人都走了哪条路,还有没有“更正确”的方法我没有。在
提前谢谢。在
鉴于注释中说
POST
,我假设这只是您正在处理的一个新对象的创建。在由于
author
必须是request.user
,因此不需要将其作为可写字段。我只需将对象的author属性设置为pre_save
中的当前用户。在类似地,如果您想处理
PUT
,您也可以将QuerySet
限制为当前用户:(看看
request.method in permissions.SAFE_METHODS
您可能需要根据请求方法执行此操作…)这样,用户就不能创建一个没有附加到自己的对象,也不能更新一个他们还没有拥有的对象。在
但是,与以往一样,TIMTOWTDI;基于权限的路由没有任何问题。(我不确定这里是否有最终答案。)
相关问题 更多 >
编程相关推荐