Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在序列化程序Django rest framework中进行权限检查,_Python_Django_Django Rest Framework_Django Permissions_Django Serializer - Fatal编程技术网

Python 在序列化程序Django rest framework中进行权限检查,

Python 在序列化程序Django rest framework中进行权限检查,,python,django,django-rest-framework,django-permissions,django-serializer,Python,Django,Django Rest Framework,Django Permissions,Django Serializer,我是一个相当新的django rest框架,我对权限有一些疑问 所以我有一个用户,他是组织的成员和某个组的成员。 假设我们有一个模型: class SomeModel: organization = models.ForeignKey(Organization) name = models.CharField() 用户只能为自己的组织创建/更新某个模型,如果他是一组“协调员”,他还可以为任何组织创建/更新 目前,我的方法是在序列化程序中的.create()和.update()方

我是一个相当新的django rest框架,我对权限有一些疑问

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

class SomeModel:
    organization = models.ForeignKey(Organization)
    name = models.CharField()
用户只能为自己的组织创建/
更新
某个模型
,如果他是一组“协调员”,他还可以为任何组织创建/
更新

目前,我的方法是在序列化程序中的
.create()
.update()
方法中检查这些条件,因为数据已经过验证,我正在那里引发
PermissionDenied
错误。但感觉这不是“正确的方式”。我尝试创建一个自定义权限类,但由于在序列化程序之前检查了权限类,因此数据没有得到验证。 你有什么建议我该怎么做

对不起,英语不好,这不是我的母语。 谢谢

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

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

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

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

要创建,您需要重写
BasePermission
类并实现
has\u 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 

使用自定义权限类时,如果用户没有创建/更新权限,为什么要进一步验证数据?我需要检查正在创建的模型中的组织是否存在。我添加了一个示例,这可能有助于理解我的问题…为了检查对象的组织,必须首先验证请求数据吗?或者如何获取当前正在创建的对象?是的,要使用此方法处理创建/更新,您必须使用组织对象的id执行查找,并检查其是否位于用户的组织中。但如果请求负载中不存在组织字段,或者数据库中不存在组织id,该怎么办。这将导致一些不必要的状态500错误。。。我可以检查所有这些东西,但这就是序列化程序和验证器的用途?您应该在用户组织id列表中执行类似于,
request.data.get('organization\u id')的操作,或者在
user
模型上为相同的对象编写一个模型方法
is\u organization\u member(organization\u id)
。您将使用
request.data.get()
传递
organization\u id
值,该值可以是
None
或某些值。然后,您可以检查该值是否在用户的
组织
ID列表中。您不必担心
organization\u id
字段是否存在或是否为有效值。同意,序列化程序应验证数据,但根据用例,如果“有效”的
organization\u id
不在用户的organizations id列表中,则不应授予请求访问权限。应在权限级别停止此类请求。如果
organization\u id
无效,您可以让请求通过,DRF序列化程序应该返回400个错误。(是的,在某种程度上,这包括一些重复。)