🔖 Справочник — Урок 38

← К оглавлению урока

⚡ Быстрая шпаргалка

# Минимальный 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_sizeintNoneКол-во элементов на странице
page_size_query_paramstrNoneПараметр URL для задания размера клиентом
max_page_sizeintNoneМаксимально допустимый размер страницы
page_query_paramstr'page'Имя параметра URL для номера страницы

Атрибуты CursorPagination

АтрибутПо умолчаниюОписание
page_sizeNoneКол-во элементов на странице
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.requestHTTP-запросы, статусы, ошибки
django.serverСообщения встроенного сервера разработки
django.db.backendsSQL-запросы (только при DEBUG=True)
django.securityНарушения безопасности