【问题标题】:Using globals() to augment django settings使用 globals() 来增加 django 设置
【发布时间】:2017-01-13 19:11:44
【问题描述】:

在 Django 世界中,在settings.py 末尾导入一个本地环境设置覆盖文件似乎是比较正常的,类似于:

from settings_local.py import *

这有几个问题,对我来说最明显的是您无法检查或修改基本设置,只能覆盖它们 - 随着时间的推移会导致一些痛苦的重复和头痛。

相反,从本地文件导入 init 函数并注入 globals() 的输出以允许本地文件更智能地读取和修改设置有什么问题吗?

settings.py:

from settings_local.py import init
init( globals() )

settings_local.py:

def init( config ):
    config['INSTALLED_APPS'].append( 'some.app' )

这似乎解决了与使用 import * 相关的一些问题,但我想知道这是否是一个坏主意,原因我还不知道。

【问题讨论】:

  • 如果多个用户同时访问该资源会发生什么?
  • 你的意思是像使用json file 来存储设置?..

标签: python django


【解决方案1】:

处理此问题的更常见和可读的方法是拥有多个设置文件,您将所有常见设置放在一个模块中,并将其导入特定环境设置文件的开头:

settings
    __init__.py
    base.py
    development.py
    staging.py
    production.py

这允许您使用您所指的突变:

# base.py
INSTALLED_APPS = [
    'foo',
    'bar'
]

# development.py
from .base import *

INSTALLED_APPS += [
    'debug_toolbar'
]

然后你使用DJANGO_SETTINGS_MODULE=settings.development在本地运行你的应用程序

【讨论】:

  • 是的,我也遇到过。我喜欢它如何导致环境覆盖最终以与基本设置文件相同的语法结束 - 与我提出的方法不同。
  • 是的,我认为这是重点。保持你的设置结构简单,没有太多的编码逻辑。当您为同一个应用程序运行具有不同任务(以及因此不同的设置)的多个服务器时,可读性方面变得更加紧迫。然后,您有多个这样的xx_settings 包,其中所有模块都从settings 包的适当级别模块以及它们自己的base.py 导入
猜你喜欢
  • 1970-01-01
  • 2018-09-15
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2020-05-11
  • 2012-09-23
  • 2012-08-07
相关资源
最近更新 更多