我正在启动一个django 1.10项目,并希望拆分设置文件。我对任何现有的解决方案都不满意。
string
/ boolean
/ dict
设置。每个string
/ boolean
/ dict
设置应仅在一个位置设置。这样可以轻松跟踪事物的定义。 我不想手动延长tuple
/ list
设置,例如INSTALLED_APPS += (test_app)
。这似乎很混乱,需要我跟踪是否在另一个文件中使用了列表或元组。
我不想要import os
并在多个文件中定义BASE_DIR
。 DRY。
我的解决方案在查看了许多其他内容后,将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。如果使用这些标识符中的任何一个的函数最终出现在其中一个设置文件中并且稍后被调用,则会中断。
我没有看到其中任何一件事发生。我有没有看到潜在的问题?
答案 0 :(得分:0)
以这种方式修改builtins
的主要问题是,它没有充分的理由为您的代码添加非本地推理。现在,公共/本地设置模块的行为隐含地取决于导入它们的模块中发生的情况。那太糟糕了。
基本上,你需要摆脱你的要求#3。
在每个模块中导入os
并不是重复自己"因为每个模块都会将os
导入到自己的命名空间中。这就是Python的工作方式。
您只想定义BASE_DIR
一次,但正确的方法是在一个模块中定义变量(比如basedir.py
),然后明确将该变量(from basedir import BASE_DIR
)导入到使用它的每个模块中。