2011-01-12 58 views
43

我有一個Django項目,我想分佈在公共存儲庫,如bitbucket或github。我想它是安裝儘可能容易的,所以我包括完整的項目,而不僅僅是可插拔的應用程序。這意味着settings.py文件將被包括在內。分配Django項目與獨特的SECRET_KEYs

如何避免settings.SECRET_KEY對於每個安裝都是相同的問題?

是否只有簡單解決方案讓用戶手動修改settings.py

我應該將密鑰存儲在默認數據庫中,並且如果它不存在,settings.py會將其初始化嗎?這將解決問題,但我想知道是否已經有一個標準的方式來做到這一點。

謝謝!

+1

你爲什麼搞亂設置?每個下載和安裝Django應用程序的人都可以信任修復這些設置。 – 2011-01-12 02:14:36

+2

將您的密鑰更改爲「--- INSERT SECRET KEY HER --- ---」 – Seth 2011-01-12 04:09:53

+5

部署SSH服務器的每個人都無法信任生成唯一的私鑰,我不明白爲什麼它應該與其他Django項目。必須完成的配置越少,發生錯誤的可能性就越小,特別是在像SECRET_KEY這樣的情況下,您不能只輸入像目錄路徑那樣簡單的東西。 – mwcz 2011-01-12 15:03:47

回答

34

我會去這樣理解:

有一個單獨的文件「secret_key.py」密鑰。該文件對於原始安裝不存在。在您的settings.py包括像:

try: 
    from .secret_key import SECRET_KEY 
except ImportError: 
    SETTINGS_DIR = os.path.abspath(os.path.dirname(__file__)) 
    generate_secret_key(os.path.join(SETTINGS_DIR, 'secret_key.py')) 
    from .secret_key import SECRET_KEY 

功能generate_secret_key(filename),你會寫生成一個名爲filename(正如我們所說的話,會在同一個目錄爲settings.pysecret_key.py)與文件的內容:

SECRET_KEY = '....random string....' 

其中隨機字符串是基於隨機數生成的密鑰。

對於密鑰生成,您可以使用Umang的建議https://stackoverflow.com/a/16630719/166761

5

一般來說,你可以把Django的配置到東西,都是應用特定的,事情是特定於服務器的。這屬於後一類。

有幾種方法可以解決服務器特定的配置問題,這在this question中有更多的討論。

對於這個特定的實例,使用我在回答其他問題時概述的方法,我在settings_local.py.sample中放置了一個佔位符用於分發,在安裝過程中,我將它複製到settings_local.py並進行編輯以適應。

2

我想解決這樣的問題:

  • 提供一個虛擬的密鑰,如:I_AM_A_DUMMY_KEY_CHANGE_ME
  • 創建一個管理命令以生成一個新的:./manage.py gen_secret_key
  • 在文檔中,ST RONGLY建議用戶儘快
1

在我的代碼有三個層次的的Django的兩勺,所以中間的一個是這樣的,其中BASE_PRIVATE_DIR是建立在基本的模板風格設置文件的運行命令。在我而言,這是從Django的目錄../../mysite_private而是介於ouside應用的git:

from .base import * 

ALLOWED_HOSTS = ['staging.django.site'] 
#Allow local override which is per deployment instance. There should probably then be 
# an instance git for version control of the production data 
try: 
    import sys 
    private_path = BASE_PRIVATE_DIR.child('production') 
    sys.path.append(private_path) 
    from private_settings import * 
except ImportError: 
    print(" No production overide private_settings.py found. This is probably an error = {}".format(private_path)) 
    # If it doesnt' exist that is fine and just use system and environment defaults 
0

下的正常文件,如果您使用模板創建一個新的項目,像django-admin.py startproject --template=path_to_template project_name只是把{{ secret_key }}成您的項目模板設置文件(例如settings.py),如SECRET_KEY = '{{ secret_key }}'和Django將爲您生成。