Django 5 для начинающих

Прогресс по курсу:  9/1004

8.7 Права доступа и токены в DRF
4 из 4 шагов пройдено

Разрешения на уровне представлений

Разрешения могут быть добавлены и на уровне представлений для более детального контроля.

Давайте обновим наш PostDetail так, чтобы его могли просматривать только пользователи-администраторы. Если мы сделаем все правильно, то пользователь, вышедший из системы вообще не сможет просмотреть API, пользователь, вошедший в систему, сможет просмотреть страницу списка, но только администратор сможет просмотреть подробную страницу.

Для удобства давайте добавим возможность авторизации прямо из нашего API сервиса, для этого введем в mysite/urls.py новый маршрутизатор:

path("api-auth/", include("rest_framework.urls")),

Тем самым мы используем встроенную систему авторизации в DRF. Проверим работу:


В файле blog_api/views.py импортируйте permissions из Django REST Framework, а затем добавьте атрибут  permission_classes в PostDetail, которое устанавливает значение IsAdminUser.

from rest_framework import generics, permissions  # new


class PostDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = (permissions.IsAdminUser,) # new


Это все, что нам нужно. Авторизуемся под любым пользователем, не администратором. Обновите просматриваемый API на http://127.0.0.1:8000/api/, Страница списка по-прежнему доступна для просмотра.


Однако если вы перейдете на http://127.0.0.1:8000/api/1/, чтобы увидеть страницу Post Detail, отображается код состояния HTTP 403 Forbidden:

Если вы войдете в API под своей учетной записью администратора, страница Post Detail будет по-прежнему видна. Таким образом, мы эффективно применили разрешение на уровне просмотра.

Прежде чем мы продолжим, удалите поле permission_classes в PostDetail. Для наших целей достаточно ограничить доступ для не аутентифицированных пользователей, что мы и сделали в mysite/settings.py с помощью конфигурации DEFAULT_PERMISSION_CLASSES.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

по какой-то причине я не могу изменить пользователя тут, он по умолчанию такой. Даже если в блоге перезайду, то этот сохраняется. При нажатии на log out просто перезагружается страница.

@Никита_Ильин, вернулся на степ и закомментил, все норм

# 'rest_framework.authentication.BasicAuthentication',