Пользовательские разрешения в рамках Rests Framework ⇐ Python

Программы на Python
Anonymous
Пользовательские разрешения в рамках Rests Framework

Сообщение Anonymous »

Мне нужны разрешения для моего приложения в DRF.
Ввод:
  • только пользователи, прошедшие проверку подлинности, не могут читать публикации и изображения
  • аутентифицированные пользователи могут создавать публикации и добавлять изображения
  • авторизованные пользователи могут редактировать и удалять публикации и изображения, авторами которых они являются.
  • пользователь с правами администратора может выполнять все действия, кроме УДАЛЕНИЯ. содержание
Модели:

Код: Выделить всё

class Publication(models.Model):
pub_text = models.TextField(null=True, blank=True)
pub_date = models.DateTimeField(auto_now_add=True)
pub_author = models.ForeignKey(User, on_delete=models.CASCADE)

class Image(models.Model):
image = models.ImageField(upload_to='images', null=True)
image_to_pub = models.ForeignKey(Publication, on_delete=models.CASCADE, null=True, related_name='images')
Просмотры:

Код: Выделить всё

class PublicationViewSet(viewsets.ModelViewSet):
queryset = Publication.objects.all()
serializer_class = PublicationSerializer
permission_classes = [PublicPermission]

class ImageViewSet(viewsets.ModelViewSet):
queryset = Image.objects.all()
serializer_class = ImageSerializer
permission_classes = [ImagePermission]
Разрешения:

Код: Выделить всё

class ImagePermission(BasePermission):

edit_methods = ['PUT', 'PATCH']

def has_permission(self, request, view):
if request.method in SAFE_METHODS:
return True
if request.user.is_authenticated:
return True

def has_object_permission(self, request, view, obj):

if request.user.is_superuser:
return True

if request.method in SAFE_METHODS:
return True

if request.user.id == Publication.objects.get(id=obj.image_to_pub_id).pub_author_id:
return True

if request.user.is_staff and request.method not in self.edit_methods:
return True

return False

class ImageAuthorPermission(BasePermission):
def has_object_permission(self, request, view, obj):
if request.user.id == Publication.objects.get(id=obj.image_to_pub_id).pub_author_id:
return True
return False
Теперь все работает так, как я описал выше. Но я не уверен, что это хорошая практика.
Я имею в виду класс . В SAFE_METHODS есть два раза проверка метода.
Если я удалю эту проверку из , неаутентифицированные пользователи не будут иметь права только для чтения.
Если я удалю это извлечение из , прошедшие проверку подлинности пользователи не будут иметь прав на редактирование и удаление.
Я уверен, что есть лучший способ настроить эти разрешения. Не так ли?
Также я попытался проверить, есть ли у текущего пользователя разрешение на доступ к изображениям, связанным с публикацией, автором которой был пользователь. Это работает, но существует ли стандартная практика проверки разрешений для связанных объектов? Я пытался удалить чек

Код: Выделить всё

if request.user.is_staff and request.method not in self.edit_methods
из и объедините классы и в списке
. Б/у & и | операторов, но успеха не добился.


Подробнее здесь: https://stackoverflow.com/questions/790 ... -framework

Вернуться в «Python»