2012-12-04 84 views
0

在django中,使用local_settings.py文件補充settings.py非常普遍,因此每臺機器都可以有不同的設置。通常人們會這樣做。使用exec和python進口

try: 
    from local_settings import * 
except ImportError: 
    print "No local settings found!" 

但是設置文件通常包含大的列表,如INSTALLED_APPS。如果我想添加一個應用程序,我寧願不將整個列表複製到local_settings.py並修改它(使可讀代碼較少,並且更新settings.py不再影響任何重寫INSTALLED_APPS的計算機)。所以,我想我可以做這樣的事情:

try: 
    f = open('local_settings.py','r') 
    exec f.read() 
except IOError: 
    print "No local settings found!" 

現在local_settings.py不再重寫整個INSTALLED_APPS變量:

INSTALLED_APPS.append('debug_toolbar') 

我的印象是,任何時候你使用execeval你可能做錯了什麼。所以我的問題是,這有什麼問題,有沒有更好的方法來做到這一點?

+1

您希望修改默認值並不排除使用'import'。你爲什麼認爲你需要使用'exec'來完成這個任務? – cdhowie

回答

1

這是我的技術:

settings.py

try: 
    from local_settings import * 
except ImportError: 
    sys.exit("FATAL: No local settings file found.") 

local_settings.py

import settings 

settings.INSTALLED_APPS += ('django_extensions',) 
+0

會不會是一個週期性的進口?如果不導入local_settings而無需導入設置,則無法導入設置... – chriscauley

+0

適合我。這將需要大約30秒來測試...... – dgel

+1

我把'try'語句放在'settings.py'的底部,所以'INSTALLED_APPS'已經被定義了。這樣你也可以覆蓋設置(比如'settings.DEBUG = True') – dgel

1

有一個更好的辦法:進口INSTALLED_APPSlocal_settings.py,複製,然後添加到副本:

import settings 

INSTALLED_APPS = settings.INSTALLED_APPS[:] + ['debug_toolbar']