Подтвердить что ты не робот

Django-object-permissions Vs django-guardian Vs django-authority

Я нашел 3 разрешения на уровне строк для Django 1.2 +

Может ли кто-нибудь сказать, есть ли какие-либо рекомендации больше, чем другие, каковы их основные различия и т.д.?

4b9b3361

Ответ 1

Я начну с этого, сказав, что мы не используем ни одного из них для разрешения уровня объекта - мы используем наш собственный метод, и я действительно этого не хотел. Если вы вообще можете избежать разрешений на уровне объектов, сделайте это, это боль для организации.

Вот как я оцениваю 3 приложения, которые вы упомянули.

Активное развитие:

  • django-guardian (1 неделю назад)
  • django-object-permissions (1 год назад)
  • django-authority (почти 2 года назад)

API

  • django-guardian (сохранить экземпляр определенной модели)
  • django-object-permissions (разрешения для регистрации)
  • django-authority (определить классы)

Вышеуказанные находятся в порядке, кстати.

Я бы рекомендовал опекуна исключительно по API, но тот факт, что он все еще разрабатывается там, где другие обычно не означает большую победу.

Ответ 2

Что касается августа '13, django-object-permissions был заменен на django-permission. 3 проекта находятся в активном развитии.

Лично я предпочитаю полномочия или разрешение, которое использует методы проверки разрешений (runtime), а не django-guardian, который использует базу данных для хранения разрешений (прикрепленных к созданию объекта, f.e.).

- EDIT -

Примеры из документов.

Джанго-хранитель

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

Вы назначаете разрешение и храните его в базе данных.

Джанго-власть

Декларация:

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)

Использование:

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!"

Он также обматывает стандартные разрешения django, но вы можете видеть гибкость в вышеупомянутом пользовательском разрешении, которое -AFAIK- вы не можете сделать в опекуне.

Обычная Usecase

Студент может принадлежать классу (классам).

опекун:

  • Когда ученику присваивается новый класс, присоедините разрешение 'attend_classroom' к объекту Student over Classroom.
  • Когда Студент удаляется из класса, удалите 'attend_classroom' для объекта Студент по классу.
  • При доступе к классу проверьте 'attend_classroom' разрешение.

авторитет:

  • Определите пользовательское разрешение ClassroomPermission.can_attend_classroom(), которое будет запрашивать, если Student принадлежит классу.
  • При доступе к классу проверьте ClassroomPermission.can_attend_classroom()

Власть хранит логику проверки в отдельном файле. Guardian нуждается в разрешениях на подключение/отсоединение, хотя остальная часть кода.