• 3.1
  • 3.2
  • 6.1
  • Версия документации: 5.0

Настройки 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()

См.также

Список настроек

Содержит полный список основных настроек и настроек встроенных приложений.

Back to Top