Настройки django manage.py по умолчанию
У меня есть файл settings.py
и dev_settings.py
, который я использую для переопределения некоторых значений для целей dev. Каждый раз, когда я запускаю команду ./manage.py
, я должен указать --settings=whatever.local_settings
. Это очень утомительно делать каждый раз, и я пытаюсь найти способ заставить manage.py загружать файл dev_settings.py по умолчанию, так что мне не нужно вводить этот длинный аргумент каждый раз, когда я хочу запустить команда.
Я попытался установить DJANGO_SETTINGS_MODULE
, однако, похоже, что manage.py переопределяет эту опцию.
Можно ли это сделать, или я обречен всегда указывать этот аргумент?
Ответы
Ответ 1
manage.py
устанавливает путь к настройкам для вас, поэтому он игнорирует DJANGO_SETTINGS_MODULE
(это в основном просто script, который обтекает django-admin.py
).
Есть 2 простых способа исправить вашу проблему:
-
установите DJANGO_SETTINGS_MODULE
и используйте django-admin.py
для запуска всех команд вместо manage.py
. Это даже лучше, если вы используете vitualenv.
-
скопируйте manage.py
и назовите его local.py
(это имя в моем случае) и переименуйте все settings
на dev_settings
.
Например:
#!/usr/bin/env python
from django.core.management import execute_manager
import imp
try:
import settings_local
except ImportError:
import sys
sys.stderr.write("Error: Can't find the file 'settings_local.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
sys.exit(1)
if __name__ == "__main__":
execute_manager(settings_local)
Теперь вы можете запускать все команды ./local.py
.
Ответ 2
Как это обычно делается, у вас есть settings.py
со всеми настройками, которые являются общими для сред (например, INSTALLED_APPS и т.д.). Затем у вас есть что-то вроде settings_local.py
, которое определяет параметры, специфичные для среды в контексте. Затем вы импортируете settings_local.py
в settings.py
.
# settings.py
from settings_local import *
settings.py
добавляется в репозиторий исходного кода, но settings_local.py
нет. (Тем не менее, вы обычно добавляете что-то вроде settings_local.py.example
в репо.)
Когда вы сначала переносите свое приложение на производство, например, вы вытаскиваете базу кода из своего репо. Затем скопируйте settings_local.py.example
в settings_local.py
и внесите необходимые изменения в среду.
Затем у вас есть отдельные файлы settings_local.py
в каждой среде, и все это просто работает.
Ответ 3
Вы можете создать псевдоним bash, добавив эти строки в файл .bash_profile:
mymanage()
{
python manage.py $1 --settings=settings_debug
}
alias mng=mymanage
Затем, когда вы запустите эту команду:
mng runserver
Файл settings_debug.py будет использоваться для настроек.
Ответ 4
Вы можете использовать django-admin.py с этой переменной окружения. Команды взаимозаменяемы, только django-admin.py не переопределяет переменную, которую вы пытаетесь использовать.
Ответ 5
Если файл настроек является общим для всей установки, вы можете просто импортировать его, например.
from settings_local import *
но обычно параметры settings_local изменяются и настраиваются для каждой установки, а моя установка script напрямую копирует файлы на целевые сайты (не беспокоясь о том, что локально, а что нет), что означает, что settings_local может быть перезаписано, чтобы избежать того, что я просто сохраняю settings_local в родительской папке целевого объекта установки и вручную импортировать его в settings.py, например
local_settings_file = os.path.join(prevFolder, "settings_local.py")
if os.path.exists(local_settings_file):
execfile(local_settings_file)