Передовые практики Django (9 части серии)
Установка разрешений пользователей является распространенной частью большинства проектов Django и может стать довольно сложным. Мы будем использовать пример блога из моего Django для начинающих книга в качестве примера. Полный исходный код можно найти здесь на Github Отказ
Пример является основным веб-сайтом блога с учетными записями пользователей, но без разрешений. Так как мы могли добавить некоторые?
Взгляды
Обычно разрешения устанавливаются в Просмотр .py
файл. Текущий вид для обновления существующего поста в блоге, Blogupdateview
выглядит следующим образом:
# blog/views.py class BlogUpdateView(UpdateView): model = Post template_name = 'post_edit.html' fields = ['title', 'body']
Входит в систему
Теперь давайте предположим, что мы хотим, чтобы пользователь вошел в систему, прежде чем они могут получить доступ Blogupdateview
Отказ Есть несколько способов сделать это, но самые простые, на мой взгляд, это использовать встроенный Loginequirequiremiremixin Отказ
Если вы никогда раньше не использовали микс, они называются в порядке слева направо Итак, мы захотим добавить вход в систему Mixin до UpdateView.
. Это означает, что если пользователь не вошел в систему, они увидят сообщение об ошибке.
# blog/views.py from django.contrib.auth.mixins import LoginRequiredMixin class BlogUpdateView(LoginRequiredMixin, UpdateView): model = Post template_name = 'post_edit.html' fields = ['title', 'body']
UserPassestesteStmixin.
Разрешения на следующий уровень – это что-то конкретное для пользователя. В нашем случае давайте применим правило, что только автор поста блога может обновить его. Мы можем использовать встроенный UserPassestesteStmixin для этого.
# blog/views.py from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin class BlogUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = Post template_name = 'post_edit.html' fields = ['title', 'body'] def test_func(self): obj = self.get_object() return obj.author == self.request.user
Обратите внимание, что мы импортируем UserPassestesteStmixin
Наверх и добавьте его в секунду в нашем списке микс для Blogupdateview
Отказ Это означает, что пользователь должен сначала войти в систему И тогда они должны пройти тест пользователя перед доступом UpdateView
Отказ Можем ли мы поставить UserPassestesteStmixin
первый? Да, но вообще лучше начать с самых общих разрешений, а затем стать более гранулированным, когда вы двигаетесь вправо.
test_func
Метод используется UserPassestesteStmixin
для нашей логики. Нам нужно переопределить его. В этом случае мы устанавливаем переменную obj
К текущему объекту, возвращенному по мнению, используя get_object. . Тогда мы говорим, если Автор
На текущем объекте соответствует текущему пользователю на веб-странице (тот, кто вошел в систему и пытается сделать изменение), а затем позвольте. Если false, ошибка будет брошена.
Есть и другие способы установки разрешений на пользователя, включая переопределение Диспетчерский метод Но UserPassestesteStmixin.
элегантный и специально разработан для этого случая использования.
Передовые практики Django (9 части серии)
Оригинал: “https://dev.to/learndjango/django-best-practices-user-permissions-e3d”