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

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

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

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

# Дамп и восстановление БД
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-spectacular OpenAPI 3 схема, Swagger UI и ReDoc для DRF

Классы разрешений 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')

OpenAPI 3 (drf-spectacular): минимальная конфигурация

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

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

SPECTACULAR_SETTINGS = {
    'TITLE': 'API Documentation',
    'DESCRIPTION': 'API documentation for the project',
    'VERSION': '1.0.0',
}

# urls.py
from drf_spectacular.views import (
    SpectacularAPIView,
    SpectacularRedocView,
    SpectacularSwaggerView,
)

urlpatterns += [
    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
    path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
    path('api/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='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')
← К оглавлению урока    Примеры →