【问题标题】:How do I use Django groups and permissions?如何使用 Django 组和权限?
【发布时间】:2011-01-24 04:36:12
【问题描述】:

我了解基本的用户内容。我知道身份验证、登录、创建帐户等。但现在我想处理组和权限。

django 组/权限的文档在哪里?这不是它:http://docs.djangoproject.com/en/dev/topics/auth/

【问题讨论】:

    标签: python django django-permissions


    【解决方案1】:

    我想你需要问的第一个问题是你需要什么权限以及什么类型。我的意思是你想要模型级还是对象级。为了澄清差异,说你有一辆模型车。如果你想授予所有汽车的权限,那么模型级别是合适的,但如果你想在每辆车的基础上授予权限,你需要对象级别。您可能需要两者,这不是我们将看到的问题。

    对于模型权限,Django 会为您处理这些……主要是。对于每个模型,Django 将以“appname.permissionname_modelname”的形式创建权限。如果您有一个名为“drivers”的应用程序,该应用程序具有 Car 模型,那么一个权限将是“drivers.delete_car”。 Django 自动创建的权限将是创建、更改和删除。出于某种奇怪的原因,他们决定不包含来自 CRUD 的读取权限,您必须自己执行此操作。请注意,出于某种原因,Django 决定将 CRUD 的“更新”更改为“更改”。要为模型添加更多权限,比如读取权限,您可以使用 Meta 类:

    class Car( models.Model ):
        # model stuff here
        class Meta:
            permissions = ( 
                ( "read_car", "Can read Car" ),
            )
    

    请注意,权限是一组元组,其中元组项是上述权限以及对该权限的描述。您不必遵循 permname_modelname 约定,但我通常会坚持下去。

    最后,要检查权限,你可以使用 has_perm:

    obj.has_perm( 'drivers.read_car' )
    

    其中 obj 是用户或组实例。我认为为此编写一个函数更简单:

    def has_model_permissions( entity, model, perms, app ):
        for p in perms:
            if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
                return False
        return True
    

    entity 是要检查(组或用户)权限的对象,model 是模型的实例,perms 是要检查的字符串形式的权限列表(例如 ['read', 'change']),以及app 是字符串形式的应用程序名称。要进行与上面的 has_perm 相同的检查,您可以这样调用:

    result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )
    

    如果您需要使用对象或行权限(它们的含义相同),那么 Django 本身并不能真正帮助您。好处是您可以同时使用模型和对象权限。如果你想要对象权限,你必须要么write your own(如果使用 1.2+)或者找到其他人编写的项目,我喜欢的是来自华盛顿时报的 django-objectpermissions

    【讨论】:

    猜你喜欢
    • 2016-07-10
    • 2017-11-11
    • 2022-01-23
    • 2012-10-05
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多