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