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

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

См.также

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

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

Back to Top