1

我正在启动一个 django 1.10 项目并想拆分设置文件。我对任何现有的解决方案都不满意。

  1. 我不希望能够覆盖另一个文件中的string//设置boolean。//dict每个设置应该只设置在一个地方。这使得跟踪定义事物的位置变得容易。 stringbooleandict
  2. 我不想手动扩展tuple/list设置,例如INSTALLED_APPS += (test_app). 这似乎很混乱,需要我跟踪另一个文件中是否使用了列表或元组。

  3. 我不想在多个文件中import os定义。干燥。BASE_DIR

我的解决方案,看了很多其他的,是settings.py用一个包含local_settings.py,common_settings.py__init__.py.

__init__.py,我import os和计算BASE_DIR。我那时

import builtins
builtins.BASE_DIR = BASE_DIR
builtins.os = os

from .common_settings import *
from . import local_settings

# At this point both modules have run and we no longer need to be messing
# with the builtins namespace.
del builtins.BASE_DIR
del builtins.os
del builtins

然后我循环dir(local_settings)并搞砸globals()以实现前两个要求(如果需要,我可以发布整个内容,但我对我的使用感兴趣builtins)。

这是用的builtins太邪恶了吗?有什么能破的。显然,如果任一标识符与更高版本的属性冲突builtins,则此代码将破坏 python。如果使用这些标识符中的任何一个的函数最终出现在一个设置文件中并且后来被调用,那么它就会中断。

不过,我没有看到任何一种情况发生。是否存在我没​​有看到的潜在问题?

4

1 回答 1

0

以这种方式修改的主要问题builtins是它无缘无故地向您的代码添加了非本地推理。通用/本地设置模块的行为现在隐含地取决于导入它们的模块中发生的情况。那很糟。

本质上,您需要摆脱您的要求#3。

  • 在每个模块中导入os并不是“重复自己”,因为每个模块都导入os到自己的命名空间中。这就是 Python 的工作原理。

  • 您只想定义BASE_DIR一次是对的,但正确的方法是在一个模块中定义变量(例如basedir.py),然后将该变量显式导入from basedir import BASE_DIR到使用它的每个模块中。

于 2016-11-28T06:52:01.617 回答