2016-11-28 74 views
1

我正在啓動一個Django 1.10項目,並且想要分割設置文件。我對任何現有的解決方案都不滿意。在分割Django設置文件時臨時修改`builtins`

  1. 我不希望能夠覆蓋在另一個從一個文件string/boolean/dict設置。每個string/boolean/dict設置應該只設置在一個地方。這可以很容易地跟蹤事物的定義。
  2. 我不想手動擴展tuple/list設置,例如, INSTALLED_APPS += (test_app)。這看起來很亂,需要我跟蹤是否在其他文件中使用了列表或元組。

  3. 我不想在import os和多個文件中定義BASE_DIR。幹。

我的解決方案,已經看了許多人一樣,是用含有local_settings.pycommon_settings.py__init__.py一個目錄替換settings.py

__init__.py,I 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

以這種方式修改builtins的主要問題是,它無緣無故地將非本地推理添加到您的代碼中。現在通用/本地設置模塊的行爲隱含地取決於導入模塊的行爲。那很糟。

基本上,你需要擺脫你的要求#3。

  • 每個模塊中導入os不是「重複自己」,因爲每個模塊導入os到它自己的命名空間。這就是Python的工作原理。

  • 你說得對想只定義BASE_DIR一次,但要做到這一點,正確的做法是在一個模塊中定義的變量(比如basedir.py),然後明確地導入變量(from basedir import BASE_DIR)到使用各個模塊它。