DjangoRestFramework - 只有当 request.user 正在查看他自己的用户对象时才可能允许某些请求?

Posted

技术标签:

【中文标题】DjangoRestFramework - 只有当 request.user 正在查看他自己的用户对象时才可能允许某些请求?【英文标题】:DjangoRestFramework - Possible to allow certain requests only if request.user is viewing his own User object? 【发布时间】:2015-10-19 02:15:34 【问题描述】:

这是我的路由器/网址:

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)

如果 request.user 是他自己的 User 对象,我只希望用户能够 PUT、POST、PATCH 和 DELETE。我的意思是,如果用户访问此 URL

users/1

然后 DRF 查找 pk 为 1 的用户。如果该用户不是 request.user,那么我不想让 request.user 能够 POST、PUT、PATCH 或 DELETE。如果用户是 request.user,那么我想允许这些请求。我有什么办法可以做到这一点吗?我正在使用 Viewsets,我希望我可以继续使用 Viewsets 来实现这一目标。

【问题讨论】:

【参考方案1】:

实现这一点的代码实际上就在文档页面上,位于this section 的底部。在这里引用它:

@detail_route(methods=['post'], permission_classes=[IsAdminOrIsSelf])
def set_password(self, request, pk=None):
    ...

为此,您需要通读文档的Authentication and permission 部分,尤其是处理associating data with a particular user 的部分,该部分建议覆盖默认的perform_create 视图方法以添加owner 参数:

def perform_create(self, serializer):
    serializer.save(owner=self.request.user)

回应以下评论:

perform_create方法属于GenericAPIView类,其功能如下(引用自here:)

此类扩展了 REST 框架的 APIView 类,为标准列表和详细视图添加了通常需要的行为。

提供的每个具体通用视图都是通过将GenericAPIView 与一个或多个 mixin 类组合而成的。

perform_create 是属于这个泛型类的函数。再次引用same section of the docs:

保存和删除挂钩:

mixin 类提供以下方法,并提供轻松覆盖对象保存或删除行为。

perform_create(self, serializer) - 在保存新对象实例时由 CreateModelMixin 调用。 ...

因此,perform_create 方法除了提供一种简单的方法来修改创建新对象时发生的情况之外没有其他目的。

【讨论】:

谢谢。快速提问,“IsAdminOrIsSelf”的文档在哪里?我试着看这里:django-rest-framework.org/api-guide/permissions,但它不在那里。知道我在哪里可以找到它吗?我最初通读了“权限”的“APIGuide”以查找该权限,但没有找到,这就是我决定发布问题的时候。 @user2719875 - 你知道,我在查找时试图找到完全相同问题的答案,但找不到任何东西。我能做的最好的就是指向source code;这很简单,也许会有用。 我很难理解 perform_create 的作用。 perform_create 是视图类的一个方法。在执行“serializer.save()”(在视图中)之后立即调用它。然后它执行“serializer.save(owner=self.request.user)”。所有者现在被传递给序列化程序的“create()”方法,但为什么还需要呢?在文档的“将数据与特定用户关联”部分中,甚至没有编辑 create() 方法以使用 owner 参数。这不会引发错误说“预期 2 个位置参数(请求和验证数据)但给出了 3 个? @user2719875 - 已修改。 perform_create 方法只是CreateModelMixin 类中的一个空的便捷方法,它可以在对象创建期间轻松修改内容。这有帮助吗? 好的,好的。但在本节中:django-rest-framework.org/tutorial/… 它说“所有者 = serializers.ReadOnlyField(source='owner.username')”。所以 owner 现在指向 owner.username,它是一个字符串,对吧?因为那时,它是权限类,文档这样做:“类 IsOwnerOrReadOnly(permissions.BasePermission): return obj.owner == request.user”。由于用户对象不能等于字符串,那不会总是返回 False 吗?

以上是关于DjangoRestFramework - 只有当 request.user 正在查看他自己的用户对象时才可能允许某些请求?的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 djangorestframework-simplejwt 和操作符 rxjs 刷新令牌时出错

DjangoRestFramework之认证组件,权限组件,频率组件

如何在 Django Rest Framework 中过滤嵌套的序列化程序?

Django REST Framework:当 POST 上存在额外字段时引发错误

Django Rest Framework:未提供身份验证凭据

djangorestframework:过滤相关字段