Django Rest Framework的POST对象权限

2024-04-23 06:33:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为超链接序列化程序实现一个自定义权限类,该序列化程序使用超链接相关字段等。在

支票非常粗略:

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的,而不仅仅是新模型的健全性/完整性检查。在

这似乎是一件很平常的事,我很好奇别人都走了哪条路,还有没有“更正确”的方法我没有。在

提前谢谢。在


Tags: theto程序trueurl权限returnif
1条回答
网友
1楼 · 发布于 2024-04-23 06:33:45

鉴于注释中说POST,我假设这只是您正在处理的一个新对象的创建。在

由于author必须是request.user,因此不需要将其作为可写字段。我只需将对象的author属性设置为pre_save中的当前用户。在

类似地,如果您想处理PUT,您也可以将QuerySet限制为当前用户:

def get_queryset(self):
  return MyClass.objects.filter(author=self.request.user)

(看看request.method in permissions.SAFE_METHODS您可能需要根据请求方法执行此操作…)

这样,用户就不能创建一个没有附加到自己的对象,也不能更新一个他们还没有拥有的对象。在

但是,与以往一样,TIMTOWTDI;基于权限的路由没有任何问题。(我不确定这里是否有最终答案。)

相关问题 更多 >