Как получить доступ к импортированным локальным настройкам без циклического импорта? - PullRequest
2 голосов
/ 22 ноября 2011

В конце моего файла settings.py у меня есть:

try:
    from local_settings import *
except ImportError:
    pass

У меня есть файл local_settings.py, в котором у меня есть некоторые настройки БД и т. Д. В этом файле я также хотел бы сделать следующее (чтобы использовать django_debug_toolbar):

INTERNAL_IPS = ('127.0.0.1',)
MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',)
INSTALLED_APPS += ('debug_toolbar',)

Я хочу разместить эти настройки здесь, чтобы они не отображались в производственной среде, которая использует основной файл settings.py, но, конечно, этот файл не может получить доступ к исходным настройкам, потому что он не знает о settings.py. Как можно избежать потенциально циклического импорта для достижения того, что я пытаюсь сделать?

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Я использую подход, при котором мои настройки на самом деле являются пакетом, а не модулем

Настройки / INIT .py base.py local.py # этот находится на .gitignore

* INIT 1008 * .py:

from setings import *
try:
    from local.py import *
except ImportError:
    pass

base.py:

import os
DEBUG = False
TEMPLATE_DEBUG = DEBUG

SITE_ROOT = os.path.join( os.path.dirname( os.path.realpath(__file__) ) ,'..' )

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
    }

etc...

local.py:

from settings import settings as PROJECT_DEFAULT

PREPEND_WWW = False
DEBUG = True
TEMPLATE_DEBUG = DEBUG

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_pyscopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'somesecretname',                      # Or path to database file if using sqlite3.
        'USER': 'somesecretuser',                      # Not used with sqlite3.
        'PASSWORD': 'somesecretpassword',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

INSTALLED_APPS += PROJECT_DEFAULT.INSTALLED_APPS + ('debug_toolbar',)

Вы можете увидеть пример этого в здесь

3 голосов
/ 22 ноября 2011

Вы не можете сделать это.Импортированный модуль выполняется в собственной области видимости и не может знать, где (и если) он был каким-либо образом импортирован.Альтернативный способ будет выглядеть примерно так:

В ваших local_settings:

INTERNAL_IPS = ('127.0.0.1',)
MIDDLEWARE_CLASSES = ('debug_toolbar.middleware.DebugToolbarMiddleware',)
INSTALLED_APPS = ('debug_toolbar',)

И в основных settings.py

try:
    import local_settings as local
    has_local = True
except ImportError:
    has_local = False

# ...
if has_local:
    MIDDLEWARE_CLASSES += local.MIDDLEWARE_CLASSES
...