⚡ Быстрая шпаргалка
# Минимальный PageNumberPagination
class MyPagination(PageNumberPagination):
page_size = 10
# Глобальная пагинация в settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
}
# Логирование SQL в settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {'console': {'class': 'logging.StreamHandler'}},
'loggers': {'django.db.backends': {'handlers': ['console'], 'level': 'DEBUG'}},
}
Классы пагинации DRF
| Класс | Путь | Параметры запроса | Когда использовать |
PageNumberPagination |
rest_framework.pagination |
?page=N&page_size=N |
Стандартная пагинация, простые API |
LimitOffsetPagination |
rest_framework.pagination |
?limit=N&offset=N |
Произвольный доступ к срезу данных |
CursorPagination |
rest_framework.pagination |
?cursor=BASE64 |
Безопасная пагинация, данные часто меняются |
Атрибуты PageNumberPagination
| Атрибут | Тип | По умолчанию | Описание |
page_size | int | None | Кол-во элементов на странице |
page_size_query_param | str | None | Параметр URL для задания размера клиентом |
max_page_size | int | None | Максимально допустимый размер страницы |
page_query_param | str | 'page' | Имя параметра URL для номера страницы |
Атрибуты CursorPagination
| Атрибут | По умолчанию | Описание |
page_size | None | Кол-во элементов на странице |
ordering | '-created' | Поле сортировки для курсора (должно существовать в модели) |
cursor_query_param | 'cursor' | Имя параметра URL для курсора |
Глобальная конфигурация REST_FRAMEWORK
# settings.py — все три варианта
REST_FRAMEWORK = {
# PageNumberPagination
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
# LimitOffsetPagination
# 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
# CursorPagination — только через кастомный класс!
# 'DEFAULT_PAGINATION_CLASS': 'myapp.pagination.CustomCursorPagination',
}
Шаблон кастомного класса пагинации
# pagination.py
from rest_framework.pagination import (
PageNumberPagination,
LimitOffsetPagination,
CursorPagination
)
class StandardPagePagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
max_page_size = 100
class StandardLimitPagination(LimitOffsetPagination):
default_limit = 10
max_limit = 100
class StandardCursorPagination(CursorPagination):
page_size = 10
ordering = 'created_at' # укажите реальное поле модели
Структура словаря LOGGING
# settings.py
import os
LOGGING = {
'version': 1, # обязательно, всегда 1
'disable_existing_loggers': False, # не отключать встроенные Django-логгеры
'formatters': { # формат строки лога (опционально)
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
},
'handlers': {
'console': { # вывод в терминал
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'file_db': { # запись SQL-запросов в файл
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs', 'db_logs.log'),
'formatter': 'verbose',
},
'file_http': { # запись HTTP-запросов в файл
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs', 'http_logs.log'),
'formatter': 'verbose',
},
},
'loggers': {
'django.db.backends': { # SQL-запросы
'handlers': ['console', 'file_db'],
'level': 'DEBUG',
'propagate': False,
},
'django.request': { # HTTP-запросы и статусы
'handlers': ['file_http'],
'level': 'INFO',
'propagate': False,
},
'django': { # все логи Django в консоль
'handlers': ['console'],
'level': 'INFO',
},
},
}
Стандартные обработчики Python logging
| Класс | Назначение |
logging.StreamHandler | Вывод в stdout/stderr (консоль) |
logging.FileHandler | Запись в конкретный файл |
logging.handlers.RotatingFileHandler | Файл с ограничением размера и ротацией |
logging.handlers.TimedRotatingFileHandler | Файл с ротацией по времени (daily/weekly) |
Важные логгеры Django
| Имя логгера | Что логирует |
django | Все сообщения Django |
django.request | HTTP-запросы, статусы, ошибки |
django.server | Сообщения встроенного сервера разработки |
django.db.backends | SQL-запросы (только при DEBUG=True) |
django.security | Нарушения безопасности |