2013-03-22 162 views
2

對於我的Django設置文件,我有一個common.pydev.pyprod.py。所有文件從common.py繼承。我想保留我的數據庫密碼,數據庫URL等作爲環境變量&存儲在我的聯機存儲庫中。Django使用環境變量拆分設置環境

我研究了Stackoverflow和Web上的環境變量,但我不確定是否對此有清楚的瞭解。

究竟應該在我的bash shell中輸入什麼內容,或者像export SOMEAPP_DB_USER='someapp',export SOMEAPP_DB_PASSWORD='1234',請到我的bash_profile中去?

如果命令是通過shell發出的,它只適用於我所在的終端會話,或者每當我調用我的應用程序虛擬環境時永久設置它?

設置文件應該如下設置?

DATABASE_USER = os.environ.get("SOMEAPP_DB_USER", ") 
DATABASE_PASSWORD = os.environ.get("SOMEAPP_DB_PASSWORD", ") 

回答

3

環境與進程關聯,並且在父進程分叉時繼承副本。在運行其他命令之前,您可以讓bash將設置注入到環境中。

以下命令將在現有bash環境下運行./manage runserver,並增加兩個額外的環境變量DJANGO_SETTINGS_MODULEMY_DB_PASSWORD

DJANGO_SETTINGS_MODULE=myproject.settings.dev MY_DB_PASSWORD=foo ./manage.py runserver 

正如您所建議的那樣,您可以在設置文件中使用以下Python代碼從環境中提取值。

import os 
db_passwd = os.environ.get('MY_DB_PASSWORD', 'default-db-password') 

你可以把你的密碼在.profile,但它可能是一個糟糕的主意,因爲你再有非敏感混合敏感信息。那麼你就必須保護.profile文件的權限,否則其他人將只能讀取該文件來獲取你的密碼。

我認爲在這種情況下更好的設置管理方法是將一個單獨的文件專用於敏感設置,例如密碼。讓這個文件的權限受到保護,只有那些需要它的用戶才能讀取,例如你的Web服務器。然後您可以從您的settings.py中讀取此密碼文件以獲取密碼。這裏使用Python ConfigParser module可能很有用。

如果需要,您可以使用環境變量指定此文件的位置,如果沒有指定,可以回退到默認值。

例如。 DB_PASSWD_FILE =〜/ tmp目錄/ test_db_passwords.ini ./manage.py的runserver

然後在settings.py

import os 
db_passwd_file = os.environ.get('DB_PASSWD_FILE', '/etc/myproject/db_passwords.ini') 

# Instantiate a ConfigParser object here to read passwords from db_passwd_file. 

這使得默認行爲在受保護的文件/etc/myprojecdt/db_passwords.ini系統看,除非該位置已被覆蓋環境變量爲DB_PASSWD_FILE

在開發過程中,您可以將DB_PASSWD_FILE設置爲.profile中用於開發目的的理智位置。DB_PASSWD_FILE指向的路徑可以通過使用文件系統權限來保護爲僅可讀取。

+0

謝謝。這對於幫助我理解環境變量的作用以及它們的實際工作方式非常出色。 – demet8 2013-03-22 04:28:28

+0

謝謝,真不錯。 – user2990084 2014-11-26 12:14:38