django-object-permissions vs django-guardian vs django-authority

Aka*_*sha 33 django django-apps django-authentication django-permissions

我已经为Django 1.2+找到了3个行级权限解决方案

有人可以告诉是否有任何推荐比其他人更多,他们的主要区别是什么,等等?

Jos*_*ton 24

我将通过说我们不使用这些对象级别权限来启动它 - 我们使用自己的自定义方法,我真的希望我们没有.如果你可以完全避免对象级权限,那么这样做很难组织起来.

这就是我评估你提到的3个应用程序的方法.

积极发展:

  1. django-guardian(1周前)
  2. django-object-permissions(1年前)
  3. django-authority(近2年前)

API

  1. django-guardian(保存已定义模型的实例)
  2. django-object-permissions(注册权限)
  3. django-authority(定义类)

顺便说一句,以上是顺序.

我纯粹仅仅依靠API推荐监护人,但事实上它仍在开发中,而其他人通常并不意味着大赢.

  • 您会考虑在 2019 年重新调整这一点吗? (2认同)

laf*_*ste 19

至于2013年8月,django-object-permissions已被django-permission取代.这三个项目正在积极发展.

就个人而言,我更喜欢权限或权限,它使用方法来检查权限(运行时),而不是django-guardian,它使用数据库来保留权限(附加在对象创建时,fe).

- 编辑 -

来自文档的示例.

Django的守护者

joe = User.objects.create(username='joe')
task = Task.objects.create(summary='Some job', content='', reported_by=boss)
joe.has_perm('view_task', task)
>> False
assign_perm('view_task', joe, task)
joe.has_perm('view_task', task)
>> True
Run Code Online (Sandbox Code Playgroud)

您分配权限并将其保留在数据库中.

Django的权力

宣言:

class FlatpagePermission(permissions.BasePermission):
    label = 'flatpage_permission'
    checks = ('morning_flatpage_check',)

    def morning_flatpage_check(self, flatpage):
        hour = int(datetime.datetime.now().strftime("%H"))
        if hour >= 8 and hour <= 12 and flatpage.url == '/about/':
            return True
        return False

authority.register(Flatpage, FlatpagePermission)
Run Code Online (Sandbox Code Playgroud)

用法:

def my_view(request):
    check = FlatPagePermission(request.user)
    flatpage_object = Flatpage.objects.get(url='/homepage/')
    if check.morning_flatpage_check(flatpage=flatpage_object):
        print "Yay, you can change *this* flatpage!"
Run Code Online (Sandbox Code Playgroud)

它还包含标准的django权限,但您可以看到上述自定义权限的灵活性--AFAIK-您无法在监护人中执行.

常见用例

学生可以属于课堂.

监护人:

  1. 将学生分配到新课堂时,请附加" 'attend_classroom'学生课堂"对象的权限.
  2. 当学生从课堂中删除时,删除'attend_classroom'Student over Classroom对象的权限.
  3. 访问"课堂"时,请检查'attend_classroom'权限.

权威:

  1. 定义自定义权限ClassroomPermission.can_attend_classroom(),该权限将查询Student是否属于Classroom.
  2. 访问课堂时,请检查 ClassroomPermission.can_attend_classroom()

权限将检查逻辑保存在单独的文件中.Guardian需要通过其余代码附加/分离权限.