Permissions Django Rest
Создал проект Blog с моделями Post и Category Post Создавать - могут только авторизированный пользователь, Редактировать - только автор, Смотреть - все
Category Редактировать и создавать - только Admin Смотреть - все
class PostViewSet(ModelViewSet): queryset = Post.objects.filter(is_active=True) serializer_class = PostSerializer
def get_permissions(self):
if self.action == 'list':
permission_classes = (AllowAny,)
else:
permission_classes = (IsOwnerOrReadOnly,)
return [permission() for permission in permission_classes]
class CategoryViewSet(ModelViewSet): queryset = Category.objects.filter(is_active=True) serializer_class = CategorySerializer
def get_permissions(self):
if self.action in ('list', 'retrieve'):
permission_classes = (AllowAny,)
else:
permission_classes = (IsAdminUser, )
return [permission() for permission in permission_classes]
Пермишены желательно писать в отдельном файле "permissions.py". Для Post думаю подойдет:
from rest_framework.permissions import SAFE_METHODS, BasePermission
class IsAuthorOrIsAdminOrReadOnly(BasePermission):
"""Пермишен пускает только Автора или Администратора. Для остальных доступ
только на чтение.
"""
def has_permission(self, request, view):
return bool(
request.method in SAFE_METHODS
or request.user.is_authenticated
)
def has_object_permission(self, request, view, obj):
return bool(
request.method in SAFE_METHODS
or obj.author == request.user
or request.user.is_staff # Если админ не может создавать, закомментируй
)
Для Category:
class IsAdminOrReadOnly(BasePermission):
def has_permission(self, request, view):
return (
request.method in SAFE_METHODS
or request.user.is_superuser
)
Что-то подобное.