как защитить пользователя от редактирования чужих записей в блоге в django?

#django

#django

Вопрос:

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

Комментарии:

1. Вопросы с просьбой порекомендовать или найти книгу, инструмент, библиотеку программного обеспечения, учебное пособие или другой сторонний ресурс не по теме для Stack Overflow, поскольку они, как правило, привлекают самоуверенные ответы и спам. Вместо этого опишите проблему и что было сделано на данный момент для ее решения.

2. спасибо, братан. будем иметь это в виду @BearBrown

Ответ №1:

Создайте mixin. Это будет что-то вроде:

 class IsOwnerMixin(object):
    permission_denied_message = _("You are not the owner of this blog - you cannot edit it")

    def dispatch (self, request, *args, **kwargs):
        if self.get_object().owner != request.user:
            raise PermissionDenied(self.get_permission_denied_message())
        return super().dispatch(request, *args, **kwargs)

    def get_permission_denied_message(self):
        """
        Override this method to override the permission_denied_message attribute.
        """
        return self.permission_denied_message
  

Смотрите документы для получения дополнительной информации:https://docs.djangoproject.com/en/2.2/topics/class-based-views/mixins

Ответ №2:

Вы можете создать mixin для этой цели. Если вы используете функциональные представления, то function decorator может выполнить трюк, в то время как вы можете использовать mixins для представлений на основе классов.

Для понимания, вот пример:

смешивание

 class IsPermittedMixin(object):
    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated():
            //check the permission of the user
                return super(IsPermittedMixin, self).dispatch(request, *args, **kwargs)
        raise PermissionDenied()
  

число просмотров

В своих представлениях вы можете использовать этот микс как:

 class EditBlog(IsPermittedMixin, View):
    //do something
  

Комментарии:

1. Миксины должны наследоваться от Python's built-in object типа. Итак, базовым классом для mixin является тип объекта python по умолчанию. Проверяя MRO(Method Resolution Order) на EditBlog класс, мы можем видеть <class ‘object’> в нем. Следовательно, IsPermittedMixin наследуется от object суперкласса с помощью super .