⚡ Быстрый справочник
# Установка
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')