Настройки 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.
The value of DJANGO_SETTINGS_MODULE should be in Python path syntax,
e.g. mysite.settings. Note that the settings module should be on the
Python import search path.
Использование django-admin¶
При использовании django-admin вы можете один раз определить переменную окружения, или каждый раз явно указывать модуль с настройками.
Example (Unix Bash shell):
export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
Example (Windows shell):
set DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
Use the --settings command-line argument to specify the settings manually:
django-admin runserver --settings=mysite.settings
Настройки сервера (mod_wsgi)¶
При настройках сервера вам понадобиться указать WSGI-приложению какой файл с настройками использовать. Для этого используйте os.environ:
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
Подробности читайте в разделе о Django mod_wsgi.
Настройки по умолчанию¶
A Django settings file doesn’t have to define any settings if it doesn’t need
to. Each setting has a sensible default value. These defaults live in the
module 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)
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 that 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, указывая, что настройки уже настроены. Для этого есть свойство:
Например:
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()
См.также
- Список настроек
Содержит полный список основных настроек и настроек встроенных приложений.