python - 序列化器中的权限检查,Django 休息框架,

标签 python django django-rest-framework django-permissions django-serializer

我是 django rest framework 的新手,我对权限有一些疑问。

所以我有一个用户,他是组织成员和某个组的成员。 假设我们有一个模型:

class SomeModel:
    organization = models.ForeignKey(Organization)
    name = models.CharField()

用户只能为自己的组织创建/更新 SomeModel,如果他是一组“协调员”,他也可以为任何组织创建/更新

目前我的方法是在序列化程序中检查这些条件,在 .create().update() 方法中,因为数据已经过验证并且我正在在那里引发 PermissionDenied 错误。但感觉这不是“正道”。我尝试制作自定义权限类,但随后未验证数据,因为在序列化程序之前检查了权限类。 您对我应该如何处理这个问题有什么建议吗?

抱歉英语不好,这不是我的母语。 谢谢!

编辑: 例子: 请求数据类似于:

payload = {'organization': 1, 'name': 'Name'} 

因此,如果用户来自组织 1 或者他是协调员,则应授予访问权限并应创建 SomeModel

最佳答案

您可以编写自定义权限类HasWritePermissions,它将检查用户是否具有写入/更新权限。

创建 custom permission class ,您将需要覆盖 BasePermission 类并实现 has_permission() 方法。如果请求被授予访问权限,此方法应返回 True,否则返回 False

class HasWritePermissions(BasePermission):

    def has_permission(self, request, view):
        # grant access to non-create/update requests
        if request.method not in ['POST', 'PUT', 'PATCH']:
            return True

        # grant access if user is a member of organization of the object 
        # to be modified or is a coordinator
        if (organization in user.organizations) or (user_is_a_coordinator):
            return True

        # Otherwise don't grant access
        return False 

关于python - 序列化器中的权限检查,Django 休息框架,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37118526/

相关文章:

python - 使用 annotate 连接 3 个表获取数据

python - 没有数据通过 drf-nested-routers PUT 传输

python - 如何检测模糊的 Blob ?

python - 如何捕捉 IndentationError

python - 如何在Django模板中使用objects.filter(user=request.user)?

python - session 在浏览器关闭时过期未正确设置 django

python - 如何调用在当前 func(class) 之后定义的一个 func(class) ? Python

php - 是否有不是完整站点的 Card/Catalog 应用程序?

python - 结构模式匹配和无穷大

django - mptt 包含以树模型作为外键的不同模型实例的计数