Рубрики
Без рубрики

Лучшие практики Django: разрешения пользователя

Установка пользовательских разрешений является распространенной частью большинства проектов Django и может стать довольно сложной QuickL … Теги с Джанго, Питоном, Учебником, начинающими.

Передовые практики 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”