每个应用程序的django设置 - 最佳实践?

时间:2014-03-13 17:38:44

标签: python django django-settings

这与这个问题有些相关 Why is django's settings object a LazyObject?

在我的django项目中,我有几个应用程序。每个应用程序都可以拥有自己的非平凡设置文件。

proj/
    proj/
         settings.py
    app/
         settings.py
         views.py

这里的一般最佳做法是什么? app app / settings.py应该

from django.conf import settings
APP_SETTING= lambda: settings.getattr('APP_SETTING', 'custom_value')
PROJ_SETTING= lambda: settings.PROJ_SETTING

然后在app / views.py中

import .settings 
X = settings.APP_SETTING
Y = settings.PROJ_SETTING

或者我应该根据django编码风格修改app / settings.py中的django lazy设置对象吗?

from django.conf import settings
# not even sure how I would check for a default value that was specified in proj/settings.py
settings.configure(APP_SETTING='custom_value')

然后每个app / views.py只通过django.conf设置使用proj / settings.py?

from django.conf import settings
X = settings.APP_SETTING
Y = settings.PROJ_SETTING

显然有很多其他的排列,但我认为我的意图很明确 提前谢谢。

4 个答案:

答案 0 :(得分:7)

最简单的解决方案是使用您自己提到的getattr(settings, 'MY_SETTING', 'my_default')技巧。但是,在多个地方做这件事可能会变得有点乏味。

额外推荐:使用每个应用前缀MYAPP_MY_SETTING

然而,有一个django应用程序可以摆脱getattr并为您处理前缀。见http://django-appconf.readthedocs.org/en/latest/

通常,您为每个应用创建一个conf.py,内容如下:

from django.conf import settings
from appconf import AppConf

class MyAppConf(AppConf):
    SETTING_1 = "one"
    SETTING_2 = (
        "two",
    )

在您的代码中:

from myapp.conf import settings

def my_view(request):
    return settings.MYAPP_SETTINGS_1  # Note the handy prefix

如果您需要自定义网站中的设置,您只需在网站settings.py中定期输入即可:

MYAPP_SETTINGS_1 = "four, four I say"

答案 1 :(得分:3)

自Django 1.7起,就存在面向应用程序配置的基于django的结构! 您可以找到描述性解决方案here

在这种新结构中,通常您可以在应用程序的文件夹中有一个apps.py文件,该文件嵌入到项目中,如下所示:

proj/
    proj/
         settings.py
    app1/
        apps.py
        views.py
    app2/
        apps.py
        views.py

app1/apps.py文件可能包含以下内容:

from django.apps import AppConfig


class App1Config(AppConfig):
    # typical systemic configurations
    name = 'app1'
    verbose_name = 'First App'

    # your desired configurations
    OPTION_A = 'default_value'
    APP_NAMESPACE = 'APP'
    APP_OPTION_B = 4

您可能会有app2/apps.py这样的东西:

from django.apps import AppConfig


class App2Config(AppConfig):
    # typical systemic configurations
    name = 'app2'
    verbose_name = 'Second App'

    # your desired configurations
    OTHER_CONFIGURATION = 'default_value'
    OPTION_C = 5

,对于Django Application文件夹中的其他apps.py,依此类推。

重要的是,应导入包含apps.py的应用程序,如下所示:

# proj/settings.py

INSTALLED_APPS = [
    'app1.apps.App1Config',
    'app2.apps.App2Config',
    # ...
]

‌现在,您可以通过以下方式访问所需的基于应用的配置:

from django.apps import apps
apps.get_app_config('app1').OPTION_A

答案 2 :(得分:1)

不确定最佳做法,但我对以下风格没有任何问题:

凸出/ settings.py

OPTION_A = 'value'

# or with namespace
APP_NAMESPACE = 'APP'
APP_OPTION_B = 4

应用程序/ settings.py

from django.conf import settings
from django.utils.functional import SimpleLazyObject

OPTION_A = getattr(settings, 'OPTION_A', 'default_value')

# or with namespace
NAMESPACE = getattr(settings, APP_NAMESPACE, 'APP')
OPTION_B = getattr(settings, '_'.join([NAMESPACE, 'OPTION_B']), 'default_value')
OPTION_C = getattr(settings, '_'.join([NAMESPACE, 'OPTION_C']), None)
if OPTION_C is None:
    raise ImproperlyConfigured('...')

# lazy option with long initialization
OPTION_D = SimpleLazyObject(lambda: open('file.txt').read())

应用程序/ views.py

from .settings import OPTION_A, OPTION_B
# or
from . import settings as app_settings
app_settings.OPTION_C
app_settings.OPTION_D  # initialized on access

答案 3 :(得分:0)

我的网站才刚刚开始,我想要一个最简单但灵活的配置解决方案。这就是我遇到的。

# in the end of the site's settings.py
. . .
# Custom settings
MYAPP_CONFIG_FILE = "/home/user/config/myapp_config.ini"

在我的应用程序的models.py中:

from django.conf import settings
import configparser

config = configparser.ConfigParser()
config.read(settings.MYAPP_CONFIG_FILE, encoding='utf_8')

此配置解析器的描述为here。这很方便,但绝对不是唯一的选择。