Файл настроек 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 необходимо указать какие настройки вы используете. Используйте для этого переменную окружения DJANGO_SETTINGS_MODULE.
Значение DJANGO_SETTINGS_MODULE должно содержать путь импорта Python, например mysite.settings. Обратите внимание, модуль с настройками должен быть доступен для импорта.
При использовании django-admin вы можете один раз определить переменную окружения, или каждый раз явно указывать модуль с настройками.
Например (Unix Bash shell):
export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
Например (Windows shell):
set DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
Используйте аргумент --settings, чтобы явно указать модуль с настройками:
django-admin runserver --settings=mysite.settings
При настройках сервера вам понадобиться указать 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.
В вашем приложении 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, вряд ли вы захотите настраивать переменную окружения для настроек.
В этом случае вы можете явно определить настройки Django. Для этого вызовите:
Например:
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.
Если вы не указали переменную окружения DJANGO_SETTINGS_MODULE, вы должны вызывать configure() перед кодом, который использует настройки.
Если вы не указали DJANGO_SETTINGS_MODULE и не вызвали configure(), Django вызовет исключение ImportError при первом доступе к настройкам.
Если вы укажите DJANGO_SETTINGS_MODULE, обратитесь к настройкам, а затем вызовите configure(), Django вызовет исключение RuntimeError, указывая, что настройки уже определены. Для проверки этого существует свойство settings.configured.
Например:
from django.conf import settings
if not settings.configured:
settings.configure(myapp_defaults, DEBUG=True)
Также нельзя вызывать configure() несколько раз, или вызывать configure() после обращения к настройкам.
Все сводится к правилам: используйте configure(), или DJANGO_SETTINGS_MODULE. Не оба, и хотя бы один.
Если вы используете компоненты 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 используются действительно отдельно. При запуске через Web-сервер, или django-admin, Django все сделает самостоятельно.
См.также
Содержит полный список основных настроек и настроек встроенных приложений.
Mar 31, 2016