Каков рекомендуемый способ обработки настроек для локальной разработки и производственного сервера? Некоторые из них (например, константы и т. Д.) Могут быть изменены / доступны в обоих, но некоторые из них (например, пути к статическим файлам) должны оставаться разными и, следовательно, не должны перезаписываться при каждом развертывании нового кода.
В настоящее время я добавляю все константы в settings.py
. Но каждый раз, когда я изменяю некоторую константу локально, мне приходится копировать ее на рабочий сервер и редактировать файл для конкретных производственных изменений ... :(
Изменить: похоже, что нет стандартного ответа на этот вопрос, я принял самый популярный метод.
Ответы:
В
settings.py
:Вы можете переопределить то, что нужно в
local_settings.py
; тогда он должен оставаться вне вашего контроля версий. Но так как вы упоминаете о копировании, я думаю, вы не используете ни один;)источник
settings_local
а неlocal_settings
группировать егоsettings.py
в алфавитных списках папок. Хранитьsettings_local.py
вне контроля версий, используя.gitignore
как учетные данные, не принадлежащие Git. Представьте себе открытый источник их случайно. Я держу в Git файл шаблона, который называетсяsettings_local.py.txt
вместо.Two Scoops of Django: Best Practices для Django 1.5 предлагает использовать контроль версий для файлов настроек и хранить файлы в отдельном каталоге:
base.py
Файл содержит общие настройки (такие как MEDIA_ROOT или ADMIN), в то время какlocal.py
иproduction.py
есть настройки сайта специфические:В базовом файле
settings/base.py
:В файле настроек локальной разработки
settings/local.py
:В файле настроек производства
settings/production.py
:Затем, когда вы запускаете django, вы добавляете
--settings
опцию:Авторы книги также выложили образец шаблона макета проекта на Github.
источник
--settings
каждый раз, вы можете установитьDJANGO_SETTINGS_MODULE
envvar. Это хорошо работает, например, с Heroku: установите его глобально на производство, затем переопределите его с помощью dev в вашем файле .env.DJANGO_SETTINGS_MODULE
Спасибо, Саймон, лучше всего использовать env var.BASE_DIR
настройки наos.path.dirname(os.path.realpath(os.path.dirname(__file__) + "/.."))
from django.conf import settings
это объект, который абстрагирует интерфейс и отсоединяет код от расположения настроек, docs.djangoproject.com/en/dev/topics/settings/…Вместо этого
settings.py
используйте этот макет:common.py
где большая часть вашей конфигурации живет.prod.py
импортирует все из общего и переопределяет все, что нужно переопределить:Точно так же
dev.py
импортирует все изcommon.py
и переопределяет все, что нужно переопределить.Наконец,
__init__.py
именно здесь вы решаете, какие настройки загружать, а также где вы храните секреты (поэтому этот файл не должен быть версионным):Что мне нравится в этом решении:
common.py
.prod.py
, специфичные для разработчикаdev.py
. Это просто.common.py
inprod.py
илиdev.py
, и вы можете переопределить все из__init__.py
.источник
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "foobar.settings")
foobar - папка с__init__.py
файлом, а настройки - это папка с__init__.py
файлом, содержащим мои секреты и импортирующим dev.py, который затем импортирует common.py. Редактировать Nevermind, у меня не было установлен модуль, который был необходим. Виноват! Это прекрасно работает !!Я использую слегка модифицированную версию стиля настроек «если отладка», которую опубликовал Харпер Шелби. Очевидно, что в зависимости от среды (win / linux / и т. Д.) Код может быть немного подправлен.
Раньше я использовал «if DEBUG», но обнаружил, что иногда мне нужно было проводить тестирование с DEUBG, установленным в False. То, что я действительно хотел отличить, была ли среда производством или развитием, что давало мне свободу выбора уровня DEBUG.
Я все еще считаю этот способ настройки незавершенным. Я не видел ни одного способа обработки настроек Django, который охватывал бы все базы и в то же время не доставлял особых хлопот при настройке (я не разочаровался в методах файлов настроек 5x).
источник
os.environ['COMPUTERNAME']
к сожалению не работает на PythonAnywhere. Вы получаете KeyError.Я использую settings_local.py и settings_production.py. Попробовав несколько вариантов, я обнаружил, что со сложными решениями легко тратить время, когда два файла настроек кажутся легкими и быстрыми.
Когда вы используете mod_python / mod_wsgi для вашего проекта Django, вам нужно указать его в файле настроек. Если вы укажете на app / settings_local.py на локальном сервере и app / settings_production.py на рабочем сервере, жизнь станет проще. Просто отредактируйте соответствующий файл настроек и перезапустите сервер (сервер разработки Django перезапустится автоматически).
источник
python manage.py runserver
), какой файл настроек использовать?TL; DR: хитрость заключается в том, чтобы изменить
os.environment
перед импортомsettings/base.py
в любойsettings/<purpose>.py
, это значительно упростит вещи.Просто думать обо всех этих переплетающихся файлах вызывает у меня головную боль. Объединение, импорт (иногда условно), переопределение, исправление того, что уже было установлено в случае
DEBUG
настройки изменились позже. Какой кошмар!Через годы я прошел через все различные решения. Все они несколько работают, но так больно управлять. WTF! Нам действительно нужны все эти хлопоты? Мы начали с одного
settings.py
файла. Теперь нам нужна документация только для того, чтобы правильно объединить все это в правильном порядке!Я надеюсь, что я наконец достиг (моего) сладкого места с решением ниже.
Давайте вспомним цели (некоторые общие, некоторые мои)
Храните секреты в секрете - не храните их в репо!
Установить / прочитать ключи и секреты через настройки среды, 12-факторный стиль .
Имеют разумные запасные значения по умолчанию. В идеале для местного развития вам не нужно ничего больше, чем по умолчанию.
… Но старайтесь сохранить производство по умолчанию. Лучше пропустить переопределение настроек локально, чем не забывать корректировать настройки по умолчанию, безопасные для производства.
Иметь возможность включать
DEBUG
/ выключать таким образом, чтобы это могло повлиять на другие настройки (например, использовать сжатый JavaScript или нет).Переключение между целевыми настройками, такими как локальные / тестирование / постановка / производство, должно основываться только на
DJANGO_SETTINGS_MODULE
, и не более того.… Но разрешить дальнейшую параметризацию через настройки среды, такие как
DATABASE_URL
.… Также позволяют им использовать различные настройки назначения и запускать их локально рядом, например. настройка производства на локальном компьютере разработчика для доступа к производственной базе данных или сжатым таблицам стилей для дымовых испытаний.
Ошибка, если переменная окружения не установлена явно (требуется как минимум пустое значение), особенно в производстве, например.
EMAIL_HOST_PASSWORD
,Отвечать на настройки по умолчанию
DJANGO_SETTINGS_MODULE
в manage.py во время запуска проекта django-adminДержите условные к минимуму, если условие определили тип среды (например, для лога - файла производство набора и этого вращения), настройки переопределения соответствующего файла замыслили настройки.
Не
Не позволяйте django читать настройки DJANGO_SETTINGS_MODULE из файла.
Тьфу! Подумайте, как это мета. Если вам нужен файл (например, docker env), прочитайте его в среду перед запуском процесса django.
Не переопределяйте DJANGO_SETTINGS_MODULE в коде вашего проекта / приложения, например. основанный на имени хоста или имени процесса.
Если вам лень устанавливать переменные окружения (например, for
setup.py test
), сделайте это в инструментах непосредственно перед запуском кода проекта.Избегайте магии и исправлений того, как django читает свои настройки, предварительно обрабатывайте настройки, но не вмешивайтесь впоследствии.
Никакой сложной логики, основанной на глупости. Конфигурация должна быть фиксированной и материализованной, а не вычисленной на лету. Предоставление запасных значений по умолчанию - достаточно логики.
Вы действительно хотите отладить, почему локально у вас есть правильный набор настроек, но при работе на удаленном сервере, на одной из ста машин что-то вычисляется по-другому? Ой! Модульные тесты? Для настроек? Шутки в сторону?
Решение
Моя стратегия состоит из превосходной django-environment, используемой с
ini
файлами стилей, обеспечивающейos.environment
настройки по умолчанию для локальной разработки, некоторые минимальные и короткиеsettings/<purpose>.py
файлы, которые имеютimport settings/base.py
ПОСЛЕ того, какos.environment
было установлено изINI
файла. Это эффективно дает нам инъекцию настроек.Хитрость заключается в том, чтобы изменить
os.environment
перед импортомsettings/base.py
.Чтобы увидеть полный пример, сделайте репо: https://github.com/wooyek/django-settings-strategy
Настройки / .env
По умолчанию для местного развития. Секретный файл, в основном для установки необходимых переменных среды. Установите для них пустые значения, если они не требуются при локальной разработке. Мы предоставляем значения по умолчанию здесь, а не в
settings/base.py
на сбой на любом другом компьютере, если он отсутствует в среде.Настройки / local.py
Здесь происходит загрузка среды из
settings/.env
, а затем импорт общих настроек изsettings/base.py
. После этого мы можем изменить некоторые, чтобы облегчить местное развитие.Настройки / production.py
Для производства нам не следует ожидать файл среды, но его легче получить, если мы что-то тестируем. Но в любом случае, чтобы не обеспечить несколько встроенных значений по умолчанию, так что
settings/base.py
можете реагировать соответственно.Основными интересными моментами здесь являются
DEBUG
иASSETS_DEBUG
переопределения, они будут применены к питонуos.environ
ТОЛЬКО, если они ПРОПУСКАЮТСЯ от среды и файла.Это будут наши производственные настройки по умолчанию, нет необходимости помещать их в среду или файл, но они могут быть переопределены при необходимости. Ухоженная!
Настройки / base.py
Это ваши в основном настройки ванильного django, с несколькими условными выражениями и множеством чтений из среды. Здесь есть почти все, поддерживая согласованное и максимально похожее окружение.
Основные различия приведены ниже (я надеюсь, что они говорят сами за себя):
Последний бит показывает силу здесь.
ASSETS_DEBUG
имеет разумное значение по умолчанию, которое может быть переопределеноsettings/production.py
и даже то, что может быть переопределено настройкой среды! Ура!По сути, мы имеем смешанную иерархию важности:
источник
Я управляю своими конфигурациями с помощью django-split-settings .
Это замена для настроек по умолчанию. Это простой, но настраиваемый. И рефакторинг ваших существующих настроек не требуется.
Вот небольшой пример (файл
example/settings/__init__.py
):Вот и все.
Обновить
Я написал сообщение в блоге об управлении
django
настройками сdjango-split-sttings
. Посмотри!источник
uwsgi.ini
файла разные настройки в dev / prod. Есть идеи, как заставить его выбирать значения из моего файла настроек?Проблема с большинством из этих решений заключается в том, что ваши локальные настройки применяются либо до общих, либо после них.
Так что невозможно переопределить такие вещи, как
в то же время.
Одно решение может быть реализовано с использованием конфигурационных файлов в стиле "ini" с классом ConfigParser. Он поддерживает несколько файлов, ленивую интерполяцию строк, значения по умолчанию и много других полезностей. После загрузки нескольких файлов можно загружать больше файлов, и их значения будут заменять предыдущие, если они есть.
Вы загружаете один или несколько файлов конфигурации в зависимости от адреса компьютера, переменных среды и даже значений в ранее загруженных файлах конфигурации. Затем вы просто используете проанализированные значения, чтобы заполнить настройки.
Я успешно использовал одну стратегию:
defaults.ini
файл по умолчаниюnet.ini
, аnet.domain.ini
затемnet.domain.webserver01.ini
каждый из них, возможно, переопределяя значения предыдущего). Эта учетная запись также предназначена для машин разработчиков, поэтому каждый из них может настроить предпочитаемый драйвер базы данных и т. Д. Для локальной разработки.cluster.cluster_name.ini
, что может определять такие вещи, как IP-адреса базы данных и кэшаВ качестве примера того, чего вы можете достичь с помощью этого, вы можете определить значение «subdomain» для per-env, которое затем используется в настройках по умолчанию (как
hostname: %(subdomain).whatever.net
) для определения всех необходимых имен хостов и файлов cookie, необходимых для работы django.Это как СУХОЙ, что я мог получить, большинство (существующих) файлов имели только 3 или 4 настройки. Кроме того, мне пришлось управлять конфигурацией клиента, поэтому существовал дополнительный набор файлов конфигурации (с такими вещами, как имена баз данных, пользователи и пароли, назначенный поддомен и т. Д.), По одному или более для каждого клиента.
Можно масштабировать это значение настолько низко или настолько высоко, как необходимо, вы просто помещаете в файл конфигурации ключи, которые вы хотите настроить для каждой среды, и как только требуется новая конфигурация, поместите предыдущее значение в конфигурацию по умолчанию и переопределите его. где необходимо.
Эта система доказала свою надежность и хорошо работает с контролем версий. Он долгое время использовался для управления двумя отдельными кластерами приложений (15 или более отдельных экземпляров сайта django на машину) с более чем 50 клиентами, где кластеры меняли размер и участников в зависимости от настроения системного администратора. ,
источник
config = ConfigParser.ConfigParser()
затем прочитать ваши файлыconfig.read(array_of_filenames)
и получить значения, используяconfig.get(section, option)
. Итак, сначала вы загружаете свою конфигурацию, а затем используете ее для чтения значений для настроек.Я также работаю с Laravel, и мне нравится реализация там. Я попытался имитировать это и комбинировать это с решением, предложенным Т. Стоуном (см. Выше):
Может быть, что-то подобное поможет вам.
источник
Помните, что settings.py - это файл с живым кодом. Предполагая, что у вас нет DEBUG, установленного на производстве (что является наилучшей практикой), вы можете сделать что-то вроде:
Довольно простой, но теоретически вы можете подняться на любой уровень сложности, основываясь только на значении DEBUG - или любой другой переменной или проверке кода, которую вы хотите использовать.
источник
Для большинства моих проектов я использую следующую схему:
from settings_base import *
)(Для запуска manage.py с пользовательскими настройками файла , который вы просто использовать --settings вариант команды:
manage.py <command> --settings=settings_you_wish_to_use.py
)источник
Мое решение этой проблемы также представляет собой сочетание некоторых решений, уже заявленных здесь:
local_settings.py
который имеет содержимоеUSING_LOCAL = True
в Dev иUSING_LOCAL = False
Prodsettings.py
I сделать импорт в этот файл , чтобы получитьUSING_LOCAL
настройкиЗатем я основываю все свои зависящие от среды настройки на этом:
Я предпочитаю, чтобы у меня было два отдельных файла settings.py, которые мне нужно поддерживать, так как мои настройки проще хранить в одном файле, чем распределять их по нескольким файлам. Например, когда я обновляю настройки, я не забываю сделать это для обеих сред.
Конечно, у каждого метода есть свои недостатки, и этот не исключение. Проблема в том, что я не могу перезаписать
local_settings.py
файл всякий раз, когда отправляю свои изменения в производственную среду, то есть я не могу просто копировать все файлы вслепую, но я могу жить с этим.источник
Я использую разновидность jpartogi, упомянутую выше, которую я нахожу немного короче:
В основном на каждом компьютере (разработка или производство) у меня есть соответствующий файл hostname_settings.py, который загружается динамически.
источник
Также есть Django Classy Settings. Я лично большой поклонник этого. Он построен одним из самых активных людей в IRC Django. Вы должны использовать переменные окружения, чтобы установить вещи.
http://django-classy-settings.readthedocs.io/en/latest/
источник
1 - Создайте новую папку внутри вашего приложения и присвойте ей настройки.
2 - Теперь создайте в нем новый
__init__.py
файл и внутри него напишите3 - Создайте три новых файла в имени папки настроек
local.py
иproduction.py
иbase.py
.4 - Внутри
base.py
скопируйте весь контент из предыдущейsettings.py
папки и переименуйте его, скажем такold_settings.py
.5 - В base.py измените путь BASE_DIR, чтобы он указывал на новый путь настройки
Старый путь->
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Новый путь ->
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Таким образом, каталог проекта может быть структурирован и может быть управляемым в рамках производства и местного развития.
источник
Чтобы использовать разные
settings
конфигурации в разных средах, создайте другой файл настроек. И в вашем сценарии развертывания, запустите сервер, используя--settings=<my-settings.py>
параметр, с помощью которого вы можете использовать различные настройки в разных средах.Преимущества использования этого подхода :
Ваши настройки будут модульными в зависимости от каждой среды
Вы можете импортировать
master_settings.py
содержащую базовую конфигурацию вenvironmnet_configuration.py
и переопределить значения, которые вы хотите изменить в этой среде.Если у вас огромная команда, у каждого разработчика может быть свой собственный ресурс,
local_settings.py
который они могут добавить в репозиторий кода без какого-либо риска изменения конфигурации сервера. Вы можете добавить эти локальные настройки,.gitnore
если вы используете git или.hginore
если вы Mercurial для контроля версий (или любой другой). Таким образом, локальные настройки даже не будут частью реальной базы кода, сохраняя ее в чистоте.источник
У меня были настройки разделены следующим образом
У нас есть 3 среды
Теперь очевидно, что постановка и производство должны иметь максимально возможную схожую среду. Итак, мы сохранили
prod.py
для обоих.Но был случай, когда мне пришлось идентифицировать работающий сервер - это рабочий сервер. @T. Ответ Стоуна помог мне написать чек следующим образом.
источник
Я разграничил его в manage.py и создал два отдельных файла настроек: local_settings.py и prod_settings.py.
В manage.py я проверяю, является ли сервер локальным или рабочим сервером. Если это локальный сервер, он загружает local_settings.py, а это рабочий сервер, он загружает prod_settings.py. В основном это выглядит так:
Я обнаружил, что проще разделить файл настроек на два отдельных файла, вместо того, чтобы выполнять множество операций if в файле настроек.
источник
В качестве альтернативы для поддержки другого файла, если вы: Если вы используете git или любую другую VCS для передачи кодов с локального на сервер, вы можете просто добавить файл настроек в .gitignore.
Это позволит вам иметь разный контент в обоих местах без каких-либо проблем. Таким образом, на сервере вы можете настроить независимую версию settings.py, и любые изменения, сделанные на локальном компьютере, не будут отражаться на сервере и наоборот.
Кроме того, он удалит файл settings.py из github, что является большой ошибкой, которую, как я видел, делают многие новички.
источник
Создание нескольких версий файла settings.py - это антишаблон для методологии 12 Factor App . используйте вместо этого python-decouple или django-environment .
источник
Я думаю, что лучшее решение предлагает @T. Стоун, но я не знаю, почему просто не использовать флаг DEBUG в Django. Я пишу код ниже для моего сайта:
Простые решения всегда лучше сложных.
источник
Я нашел ответы здесь очень полезными. (Было ли это решено более окончательно? Последний ответ был год назад.) После рассмотрения всех перечисленных подходов я нашел решение, которого здесь не увидел.
Мои критерии были:
Я думал, что переключение на хост-машину имело некоторый смысл, но потом понял, что реальная проблема заключается в разных настройках для разных сред , и у меня был момент ага. Я поместил этот код в конец моего файла settings.py:
Таким образом, приложение по умолчанию настроено на производственные параметры, что означает, что вы явно «заносите в белый список» свою среду разработки. Гораздо безопаснее забыть установить переменную окружения локально, чем если бы это было наоборот, и вы забыли установить что-то в работе и позволить использовать некоторые параметры разработки.
При локальной разработке, либо из оболочки, либо в файле .bash_profile, либо где угодно:
(Или, если вы разрабатываете для Windows, установите через панель управления или как там ее называют в наши дни ... Windows всегда делала это настолько неясным, что вы могли устанавливать переменные среды.)
При таком подходе все настройки dev находятся в одном (стандартном) месте и при необходимости просто перекрывают производственные. Любое переключение с настройками разработки должно быть абсолютно безопасным, чтобы взять на себя контроль над исходным кодом без ущерба для производства.
источник