如何在没有循环导入的情况下访问导入的本地设置?

时间:2011-11-21 23:19:39

标签: python django django-debug-toolbar

在我的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 个答案:

答案 0 :(得分:3)

你不能这样做。导入的模块在其自己的范围内执行,无法知道以何种方式(以及是否)以任何方式导入它。另一种方式是这样的:

在你的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

答案 1 :(得分:3)

我使用的方法是我的设置实际上是包而不是模块

设置/   的初始化的.py   base.py   local.py #this one on .gitignore

<强>初始化的.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',)

您可以在here

中查看此示例