🔖 Справочник: Auth и Permissions

Шпаргалка по командам, классам и паттернам практикума 10

⚡ Быстрый справочник

# Установка
pip install drf-yasg

# Дамп и восстановление БД
python manage.py dumpdata --indent=4 > db_backup.json
python manage.py migrate
python manage.py loaddata db_backup.json

# Миграции после Meta.permissions
python manage.py makemigrations
python manage.py migrate

# Проверка разрешения
request.user.has_perm('app_label.codename')

Команды manage.py

Команда Описание
python manage.py makemigrations Создать файлы миграций по изменениям моделей
python manage.py migrate Применить все миграции к БД
python manage.py dumpdata --indent=4 > file.json Экспортировать все данные в JSON-файл
python manage.py dumpdata store --indent=4 Экспортировать данные только приложения store
python manage.py loaddata file.json Восстановить данные из JSON-файла

pip-пакеты практикума

Пакет Назначение
pip install drf-yasg Swagger/ReDoc документация для DRF (OpenAPI 2.0)

Классы разрешений DRF

Класс Поведение
IsAuthenticated Только аутентифицированные пользователи
IsAuthenticatedOrReadOnly Чтение для всех, запись только для авторизованных
IsAdminUser Только пользователи с is_staff=True
AllowAny Доступ без ограничений (в т.ч. анонимам)
BasePermission Базовый класс для создания кастомных разрешений

Структура BasePermission

from rest_framework.permissions import BasePermission

class MyPermission(BasePermission):
    # View-level (список объектов)
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)

    # Object-level (конкретный объект)
    def has_object_permission(self, request, view, obj):
        # SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS')
        if request.method in ['GET', 'HEAD', 'OPTIONS']:
            return True
        return obj.owner == request.user

Пользовательские разрешения Django (Meta.permissions)

# models.py
class Order(models.Model):
    class Meta:
        permissions = [
            ("can_view_statistics", "Can view statistics"),
        ]

# Проверка: 'app_label.codename'
request.user.has_perm('store.can_view_statistics')

# В DRF-разрешении:
class CanViewStatistics(BasePermission):
    def has_permission(self, request, view):
        return request.user.has_perm('store.can_view_statistics')

Swagger (drf-yasg): минимальная конфигурация

# settings.py
INSTALLED_APPS = ['rest_framework', 'drf_yasg', ...]

# urls.py
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

schema_view = get_schema_view(
    openapi.Info(
        title="API Documentation",
        default_version='v1',
        description="API documentation for the project",
    ),
    public=True,
    permission_classes=(permissions.AllowAny,),
)

urlpatterns += [
    path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]

Паттерны request.user в представлениях

# Авто-привязка при создании
def perform_create(self, serializer):
    serializer.save(customer=self.request.user)

# Фильтрация по владельцу
def get_queryset(self):
    return Order.objects.filter(customer=self.request.user)

# Проверка разрешения в has_perm
def has_permission(self, request, view):
    return request.user.has_perm('store.can_view_statistics')
← К оглавлению урока    Примеры →