2015-07-30 4 views
1

Я пытаюсь создать Django Rest Framework ModelViewSets, которые являются только персоналом. Когда я пытаюсь использовать стандартный декоратор Django @staff_member_required Я получаю ошибки, которые заставляют меня думать, что декораторы не будут работать с Django Rest Framework.Разрешения только для персонала в Django Rest Framework

Итак, я пытаюсь написать свой собственный MixViewSet. В основном он работает, как я хочу, кроме метода обновления, который я не могу сделать.

Итак, два вопроса: есть ли более элегантный способ сделать это, а если нет, что не так с моим методом обновления? Я не могу найти документацию по обновлению, поэтому я использую свое лучшее предположение о том, как это сделать, но оно не работает.

Спасибо!

Джон

Вот мой класс:

class StaffOnlyModelViewSet(viewsets.ModelViewSet): 

def list(self, request): 
    if self.request.user.is_staff: 
     return super(StaffOnlyModelViewSet, self).list(request) 
    else: 
     content = {'Unauthorised': 'This API is private'} 
     return Response(content, status=status.HTTP_401_UNAUTHORIZED) 

def retrieve(self, request, pk=None): 
    if self.request.user.is_staff: 
     return super(StaffOnlyModelViewSet, self).retrieve(request, pk=None) 
    else: 
     content = {'Unauthorised': 'This API is private'} 
     return Response(content, status=status.HTTP_401_UNAUTHORIZED) 

def create(self, request): 
    if self.request.user.is_staff: 
     return super(StaffOnlyModelViewSet, self).create(request) 
    else: 
     content = {'Unauthorised': 'This API is private'} 
     return Response(content, status=status.HTTP_401_UNAUTHORIZED) 

def update(self, request, pk=None): 
    if self.request.user.is_staff: 
     return super(StaffOnlyModelViewSet, self).update(request, pk=None) 
    else: 
     content = {'Unauthorised': 'This API is private'} 
     return Response(content, status=status.HTTP_401_UNAUTHORIZED) 

def destroy(self, request, pk=None): 
    if self.request.user.is_staff: 
     return super(StaffOnlyModelViewSet, self).destroy(request, pk=None) 
    else: 
     content = {'Unauthorised': 'This API is private'} 
     return Response(content, status=status.HTTP_401_UNAUTHORIZED) 
+0

1 nitpicky thing ... 401_UNAUTHORIZED обычно используется, чтобы сообщить запрашивающему, что они должны пройти аутентификацию, чтобы получить доступ. 403_FORBIDDEN явно сообщает запрашивающему, что они не могут получить доступ с их аутентифицированными учетными данными (потому что они не являются персоналом). Это, вероятно, не имеет значения, хотя (: –

ответ

9

Более изящный способ достижения своей цели является использование permissions. Они могут быть объявлены глобально, на уровне представления, или с декоратором

Из source:

class IsAdminUser(BasePermission): 
    """ 
    Allows access only to admin users. 
    """ 
    def has_permission(self, request, view): 
     return request.user and request.user.is_staff 

Вы можете использовать это в вашем views.py (см документацию для других способов)

from rest_framework.permissions import IsAdminUser 

class StaffOnlyModelViewSet(viewsets.ModelViewSet): 
    permission_classes = (IsAdminUser,) 

Некоторые пользователи путаются разрешениями и аутентификацией и отношениями между ними, поэтому я дам вам быстрый учебник.

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

В сочетании друг с другом вы можете контролировать доступ пользователей. Например, если пользователь терпит неудачу при проверке подлинности, но класс разрешений в представлении установлен на «IsAuthenticatedOrReadOnly», они все равно могут использовать GET/LIST ресурс. «IsAdminUser» заявляет, что пользователь должен пройти аутентификацию и должен также быть персоналом для доступа к этому представлению. Это то, что вы хотите в этом случае.

+0

Теперь это тот ответ, на который я надеялся! Что-то аккуратное и легкое, что работает. Спасибо. – John

Смежные вопросы