🐛 Типичные ошибки — Урок 38

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

⚡ Топ-5 ошибок урока 38

  1. CursorPagination без кастомного класса → AttributeError на ordering
  2. FileHandler без созданной директории → FileNotFoundError
  3. disable_existing_loggers: True → Django-логгеры отключены
  4. SQL-логи не появляются → забыли DEBUG = True
  5. Относительный путь в filename → файл создаётся в неизвестном месте

Типичные ошибки при работе с пагинацией и логированием

Ошибка 1: CursorPagination без поля ordering в модели

Симптом: AssertionError: Invalid ordering field 'created' on serializer или FieldError: Cannot resolve keyword 'created' into field

Неверно:

# settings.py — используем базовый CursorPagination напрямую
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',
    'PAGE_SIZE': 5,
}
# В модели Book нет поля 'created' — падает при первом запросе!

Верно:

# pagination.py
from rest_framework.pagination import CursorPagination

class BookCursorPagination(CursorPagination):
    page_size = 5
    ordering = 'published_date'  # поле, которое РЕАЛЬНО существует в модели
# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'first_app.pagination.BookCursorPagination',
    'PAGE_SIZE': 5,
}

Ошибка 2: FileHandler — директория не создана

Симптом: FileNotFoundError: [Errno 2] No such file or directory: '/path/to/logs/db.log' — сервер не запускается.

Неверно:

# settings.py — директория logs/ не создана
'file': {
    'class': 'logging.FileHandler',
    'filename': os.path.join(BASE_DIR, 'logs', 'db_logs.log'),  # logs/ не существует!
}

Верно:

# settings.py — создать директорию до настройки LOGGING
import os

LOGS_DIR = os.path.join(BASE_DIR, 'logs')
os.makedirs(LOGS_DIR, exist_ok=True)  # создаст, если не существует

LOGGING = {
    ...
    'handlers': {
        'file': {
            'class': 'logging.FileHandler',
            'filename': os.path.join(LOGS_DIR, 'db_logs.log'),
        },
    },
    ...
}

Ошибка 3: disable_existing_loggers: True

Симптом: после добавления LOGGING пропадают все системные логи Django — ошибки 500, предупреждения безопасности, статусы HTTP-запросов.

Неверно:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,  # отключает ВСЕ встроенные логгеры!
    ...
}

Верно:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  # встроенные логгеры продолжают работать
    ...
}

Ошибка 4: SQL-логи не появляются (DEBUG = False)

Симптом: LOGGING настроен, но django.db.backends ничего не пишет ни в консоль, ни в файл.

Причина:

В Django логгер django.db.backends с уровнем DEBUG передаёт SQL только при DEBUG = True. При DEBUG = False Django оптимизирует работу и не собирает тексты запросов.

Проверьте:

# settings.py
DEBUG = True  # обязательно для SQL-логов в django.db.backends

LOGGING = {
    ...
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',  # нужно совпадение с handler.level или ниже
        },
    },
}

Ошибка 5: Относительный путь в FileHandler

Симптом: файл лога создаётся в непредсказуемом месте — зависит от того, откуда запускается сервер.

Неверно:

'file': {
    'class': 'logging.FileHandler',
    'filename': 'db.log',  # относительный путь — плохая практика!
}

Верно:

'file': {
    'class': 'logging.FileHandler',
    'filename': os.path.join(BASE_DIR, 'db.log'),  # абсолютный путь относительно корня проекта
}

Ошибка 6: pagination_class без page_size

Симптом: API возвращает весь queryset без пагинации, хотя класс задан.

Неверно:

class BookPagination(PageNumberPagination):
    pass  # page_size не задан — пагинация не работает!

class BookListView(ListAPIView):
    pagination_class = BookPagination

Верно:

class BookPagination(PageNumberPagination):
    page_size = 10  # обязательно задать размер страницы!

class BookListView(ListAPIView):
    pagination_class = BookPagination

Или задать PAGE_SIZE глобально в REST_FRAMEWORK.

Ошибка 7: Неверный путь к кастомному классу пагинации

Симптом: ImportError: Module "myapp.pagination" does not define a "SomePagination" attribute/class

Неверно:

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'pagination.CustomCursorPagination',  # нет имени приложения!
}

Верно:

# settings.py — полный dotted path: app_name.module.ClassName
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'first_app.pagination.CustomCursorPagination',
}

Путь должен быть полным: имя_приложения.имя_модуля.ИмяКласса.