Короткий ответ
settings.py — модуль с конфигурацией проекта (БД, установленные приложения, секретные ключи и т. п.); из кода настройки читают через объект django.conf.settings, а не импортируя модуль напрямую.
Как это работает подробнее
При старте Django загружает модуль, указанный в переменной окружения DJANGO_SETTINGS_MODULE, и оборачивает его в ленивый объект settings. Обращение к любому атрибуту settings.X возвращает значение, определённое в этом модуле (или в global_settings по умолчанию).
Пример кода
example.py
# views.py
from django.conf import settings
def debug_info(request):
return {"debug_mode": settings.DEBUG, "allowed_hosts": settings.ALLOWED_HOSTS}
# Проверка: в tests можно использовать
# from django.test import override_settings
# with override_settings(DEBUG=True):Что использовать на практике
- Практика. Всегда импортируют
from django.conf import settingsи читаютsettings.DEBUG,settings.DATABASESи т. д. Это позволяет подменять настройки в тестах черезoverride_settingsи не привязываться к конкретному файлу настроек.
Подводные камни
- Риск. Прямой
import myproject.settings as settingsвместоdjango.conf.settings— теряется ленивая загрузка и возможность переопределения в тестах; хранение секретов прямо вsettings.pyв открытом виде вместо переменных окружения.