2012-02-09 3 views
2

Я подчиняюсь структуре проекта as laid out by Zachary Voase, но я борюсь с одной конкретной проблемой.Отдельная переменная пользовательских настроек между разработкой, постановкой и производством

Мне очень хотелось бы иметь настраиваемую логическую переменную (назовем ее SEND_LIVE_MAIL), которую я буду использовать в проекте. В принципе, я бы хотел использовать эту переменную настроек в своем коде, и если SEND_LIVE_MAIL True, действительно отправляйте почту, тогда как когда она установлена ​​в False, просто распечатайте ее содержимое на консоль. Последнее применимо к среде dev и при запуске unittests.

Что было бы хорошим способом реализации этого? В настоящее время, в зависимости от среды, сервер django использует настройки dev, staging или prd, но для переменных пользовательских настроек я считаю, что их нужно импортировать «буквально». Другими словами, я бы использовал в своих взглядах что-то вроде

from settings.development import SEND_LIVE_MAIL 

который, конечно же, не является тем, что я хочу. Я хотел бы быть в состоянии сделать что-то вроде:

from settings import SEND_LIVE_MAIL 

и в зависимости от окружающей среды, правильное значение присваивается переменной SEND_LIVE_MAIL.

Заранее благодарен!

ответ

6

В любом случае вы не должны импортировать файлы из ваших файлов настроек. Использование:

>>> from django.conf import settings 
>>> settings.SEND_LIVE_MAIL 
True 
1

Вы можете сделать что-то подобное для самых различных условиях окружающей среды на основе, но вот пример для всего SEND_LIVE_MAIL.

settings_config.py

import re 
import socket 

class Config: 
    def __init__(self): 
     fqdn = socket.getfqdn() 
     env = re.search(r'(devhost|stagehost|prodhost)', fqdn) 
     env = env and env.group(1) 
     env = env or 'devhost' 
     if env == 'devhost': 
      self.SEND_LIVE_MAIL = # whatever 
     elif env == 'stagehost': 
      self.SEND_LIVE_MAIL = # whatever 
     elif env == 'prodhost': 
      self.SEND_LIVE_MAIL = # whatever 

config = Config() 

settings.py

from settings_config import config 

SEND_LIVE_MAIL = config.SEND_LIVE_MAIL 
+0

Это будет чередовать его текущий способ реализации настроек. На самом деле, это не решение проблемы, поскольку его проект в настоящее время настроен. Даже тогда, однако, не рекомендуется импортировать настройки из фактического файла settings.py. Django показывает, что фактические настройки будут использоваться в 'django.conf.settings', поэтому нет причин делать что-то особенное. –

3

Самое простое решение, чтобы это в нижней части файла настроек:

try: 
    from local_settings import * 
except ImportError: 
    pass 

И в loc al_settings.py определяет все переопределения, относящиеся к среде. Обычно я не фиксирую этот файл для контроля версий.

Есть более продвинутые способы сделать это, где вы получите файл настроек по умолчанию и переопределение для каждого окружения.

В этой статье Дэвид Крамер охватывает различные подходы, в том числе и из тех, о которых я говорил: http://justcramer.com/2011/01/13/settings-in-django/

+0

Метод, который использует OP, на самом деле довольно устрашающий. Я использовал его сам на некоторое время. Он предоставляет вам возможность фиксировать все ваши настройки (создание, постановка, даже несколько отдельных параметров разработчика), все в вашем репозитории, а затем вам нужно создать символическую ссылку, к которой вы хотите использовать конкретный файл настроек. Это довольно пятно. –

2
import os 
PROJECT_PATH = os.path.dirname(__file__) 
try: 
    execfile(os.path.join(PROJECT_PATH, local_settings.py')) 
except IOError: 
    pass 

Тогда вы можете иметь свой local_settings.py вести себя так, как будто она была приклеена непосредственно в settings.py:

$ cat local_settings.py 
INSTALLED_APPS += ['foo'] 
Смежные вопросы