Настройки Django¶
Файл настроек Django содержит полную конфигурацию установленного проекта. Этот раздел описывает какие настройки доступны и как они работают.
Основы¶
Файл настроек – это просто модуль Python с переменными модуля.
Вот пример настроек:
ALLOWED_HOSTS = ["www.example.com"]
DEBUG = False
DEFAULT_FROM_EMAIL = "webmaster@example.com"
Примечание
Если установить False в DEBUG, вам также необходимо правильно определить ALLOWED_HOSTS.
Так как файл настроек это модуль Python, верно следующее:
Не допускаются ошибки синтаксиса Python.
Можно динамически определять настройки, используя обычный синтаксис Python. Например:
MY_SETTING = [str(i) for i in range(30)]
Можно импортировать значения из других файлов настроек.
Определения файла настроек¶
- DJANGO_SETTINGS_MODULE¶
Когда вы используете Django, вы должны указать ему, какие настройки вы используете. Сделайте это, используя переменную среды DJANGO_SETTINGS_MODULE.
Значение DJANGO_SETTINGS_MODULE должно быть в синтаксисе пути Python, например mysite.settings. Обратите внимание, что модуль настроек должен находиться в Python sys.path.
Использование django-admin¶
При использовании django-admin вы можете один раз определить переменную окружения, или каждый раз явно указывать модуль с настройками.
Пример (оболочка Unix Bash):
export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
Пример (оболочка Windows):
set DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
Используйте аргумент командной строки --settings, чтобы указать настройки вручную:
django-admin runserver --settings=mysite.settings
Настройки сервера (mod_wsgi)¶
При настройках сервера вам понадобиться указать WSGI-приложению какой файл с настройками использовать. Для этого используйте os.environ:
import os
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
Подробности читайте в разделе о Django mod_wsgi.
Настройки по умолчанию¶
Файл настроек Django не должен определять какие-либо настройки, если в этом нет необходимости. Каждый параметр имеет разумное значение по умолчанию. Эти значения по умолчанию находятся в модуле django/conf/global_settings.py.
Django использует следующий алгоритм для загрузки настроек:
Загружает настройки из
global_settings.py.Загружает настройки из указанного файла настроек, перезаписывая значения по умолчанию.
Обратите внимание, файла с настройками не должен импортировать global_settings.
Узнать какие настройки вы поменяли¶
Команда python manage.py diffsettings показывает разницу между текущими настройками и настройками по умолчанию Django.
Подробности смотрите в описании diffsettings.
Использование настроек в коде Python¶
В вашем приложении Django вы можете использовать настройки, импортировав django.conf.settings. Например:
from django.conf import settings
if settings.DEBUG:
# Do something
...
Обратите внимание, django.conf.settings – это не модуль, а объект. По этому нельзя импортировать отдельные настройки:
from django.conf.settings import DEBUG # This won't work.
Также ваш код не должен использовать непосредственно global_settings или ваш модуль настроек. django.conf.settings предоставляет единый интерфейс работы с настройками, реализуя концепцию настроек по умолчанию и настроек проекта. Также разделяет код, который использует настройки, и сами настройки.
Изменяем настройки в процессе работы¶
Вам не следует менять настройки в процессе работы приложения. Например, не делайте следующее в представлении:
from django.conf import settings
settings.DEBUG = True # Don't do this!
Единственное место, где вы можете определять настройки – это файл с настройками.
Безопасность¶
Поскольку файл настроек содержит конфиденциальную информацию, например пароль базы данных, вам следует приложить все усилия, чтобы ограничить доступ к нему. Например, измените права доступа к файлу, чтобы его могли читать только вы и пользователь вашего веб-сервера. Это особенно важно в среде общего хостинга.
Доступные настройки¶
Полный список настроек смотрите в разделе о настройках.
Добавление собственных настроек¶
Ничто не мешает вам создавать собственные настройки для собственных приложений Django, но следуйте следующим рекомендациям:
Названия настроек должны быть в верхнем регистре.
Не изобретайте заново существующие настройки.
Для настроек, которые представляют множество, Django использует списки, но это это не обязательно.
Использование настроек без установки DJANGO_SETTINGS_MODULE¶
В некоторых случаях вам может потребоваться обойти переменную среды DJANGO_SETTINGS_MODULE. Например, если вы используете систему шаблонов отдельно, вам, скорее всего, не понадобится настраивать переменную среды, указывающую на модуль настроек.
В этом случае вы можете явно определить настройки Django. Для этого вызовите:
- django.conf.settings.configure(default_settings, **settings)¶
Пример:
from django.conf import settings
settings.configure(DEBUG=True)
Вы можете передать в configure() любое количество именованных аргументов, которые представляют настройки и их значения. Названия аргументов должны быть в верхнем регистре, как и названия настроек. Если какая-то настройка не была указанна в configure(), Django при необходимости будет использовать значение по умолчанию.
Настройка Django таким способом необходима, и рекомендуется использовать, при использовании части фреймверка в другом приложении.
При настройке через settings.configure() Django не меняет переменные окружения (смотрите описание TIME_ZONE, чтобы узнать когда это происходит). Подразумевается, что вы уже полностью контролируете свое окружение.
Собственные значения по умолчанию¶
Если вы хотите, чтобы значения по умолчанию загружались не с django.conf.global_settings, вы можете указать аргумент default_settings (или первый аргумент) при вызове configure(), который содержит модуль или класс со значениями по умолчанию.
В этом примере настройки по умолчанию загружаются с myapp_defaults, и настройка DEBUG равна True, несмотря на значение из myapp_defaults:
from django.conf import settings
from myapp import myapp_defaults
settings.configure(default_settings=myapp_defaults, DEBUG=True)
Следующий пример, который использует myapp_defaults как позиционный аргумент, аналогичен предыдущему:
settings.configure(myapp_defaults, DEBUG=True)
Обычно вам не нужно переопределять значения по умолчанию таким образом. Параметры Django по умолчанию достаточно просты, поэтому их можно безопасно использовать. Имейте в виду, что если вы передадите новый модуль по умолчанию, он полностью заменит значения по умолчанию Django, поэтому вы должны указать значение для каждого возможного параметра, который может использоваться в импортируемом коде. Полный список можно найти в django.conf.settings.global_settings.
Требуется либо configure(), либо DJANGO_SETTINGS_MODULE.¶
Если вы не устанавливаете переменную среды DJANGO_SETTINGS_MODULE, вы должны вызвать configure() в какой-то момент перед использованием любого кода, считывающего настройки.
Если вы не установите DJANGO_SETTINGS_MODULE и не вызовете configure(), Django вызовет исключение ImportError при первом обращении к настройке.
Если вы установите DJANGO_SETTINGS_MODULE, каким-то образом получите доступ к значениям настроек, затем вызовете configure(), Django выдаст RuntimeError, указывая, что настройки уже настроены. Для этого есть свойство:
- django.conf.settings.configured¶
Например:
from django.conf import settings
if not settings.configured:
settings.configure(myapp_defaults, DEBUG=True)
Также нельзя вызывать configure() несколько раз, или вызывать configure() после обращения к настройкам.
Это сводится к следующему: используйте ровно один из configure() или DJANGO_SETTINGS_MODULE. Не то и другое, и не ни то, ни другое.
Для «отдельного» использования Django необходимо вызывать django.setup()¶
Если вы используете компоненты Django «отдельно» – например, в Python скрипте, который загружает шаблоны Django и рендерит их, или использует ORM для загрузки данных – вам понадобится указать настройки.
После того, как вы указали переменную окружения DJANGO_SETTINGS_MODULE, или вызвали configure(), необходимы вызвать django.setup(), чтобы загрузить настройки и позволить Django загрузить приложения. Например:
import django
from django.conf import settings
from myapp import myapp_defaults
settings.configure(default_settings=myapp_defaults, DEBUG=True)
django.setup()
# Now this script or any imported module can use any part of Django it needs.
from myapp import models
Обратите внимание, что вызов django.setup() необходим только в том случае, если ваш код действительно автономен. При вызове вашего веб-сервера или через django-admin Django сделает это за вас.
django.setup() можно вызвать только один раз.
Поэтому избегайте добавление логики приложения в отдельный скрипт, чтобы вам не приходилось импортировать этот скрипт где-либо в коде приложения. Если вы не можете избежать этого, добавьте django.setup() в блок if:
if __name__ == "__main__":
import django
django.setup()
См.также
- Список настроек
Содержит полный список основных настроек и настроек встроенных приложений.