Настройки Django¶
Файл настроек Django содержит всю конфигурацию вашей установки Django. Этот документ объясняет, как работают настройки и какие настройки доступны.
Основы¶
Файл настроек - это просто модуль Python с переменными на уровне модуля.
Вот несколько примеров настроек:
ALLOWED_HOSTS = ['www.example.com']
DEBUG = False
DEFAULT_FROM_EMAIL = 'webmaster@example.com'
Примечание
Если вы установили DEBUG
в False
, вам также необходимо правильно установить параметр 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 import search 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 documentation для получения дополнительной информации и других общих элементов для WSGI-приложения Django.
Настройки по умолчанию¶
Файл настроек 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!
Единственное место, куда следует назначать настройки, - это файл настроек.
Безопасность¶
Поскольку файл настроек содержит конфиденциальную информацию, такую как пароль базы данных, вы должны предпринять все попытки ограничить доступ к нему. Например, измените права доступа к файлу так, чтобы его могли читать только вы и пользователь вашего веб-сервера. Это особенно важно в среде общего хостинга.
Доступные настройки¶
Полный список доступных настроек см. в разделе settings reference.
Создание собственных настроек¶
Ничто не мешает вам создавать свои собственные настройки для своих 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)
Normally, you will not need to override the defaults in this fashion. The
Django defaults are sufficiently tame that you can safely use them. Be aware
that if you do pass in a new default module, it entirely replaces the Django
defaults, so you must specify a value for every possible setting that might be
used in the code you are importing. Check in
django.conf.settings.global_settings
for the full list.
Требуется либо 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.setup()
необходим для «автономного» использования Django¶
Если вы используете компоненты 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()
См.также
- The Settings Reference
- Содержит полный список настроек основных и дополнительных приложений.