2017-06-15 50 views
2

Django希望您使用settings.py中的環境變量來適應多種環境(例如local,heroku,AWS)。Django設置:引發KeyError,引發不正確配置或使用默認設置?

我想我應該在環境變量DB_USERNAME中定義 - 例如DB的用戶名。我應該如何閱讀它?

import os 
DB_USERNAME = os.environ['DB_USERNAME'] 
DB_USERNAME = os.environ.get('DB_USERNAME') 
DB_USERNAME = os.environ.get('DB_USERNAME', 'john') 

我應該捕獲KeyError並自己提高ImproperlyConfigured嗎? 我更喜歡讓應用程序停止,而不是使用不正確的設置(默認值,忘記設置變量的人等)來運行它。

在默認情況下,甚至可能發生約翰存在loaclly和遠程但具有不同權限的情況。它看起來不太健壯。

+0

難道你不認爲這是一個壞主意,在OS環境變量有你的DB名稱? –

+0

其db用戶名不是db名稱 –

回答

2

我會建議一個不同的方法來處理你在做什麼。

我用下面的過程:

  1. 在它創建.env.ini文件與環境變量:

    DB_USERNAME=myDB 
    A_NUMBER=1 
    ALLOWED_HOSTS=localhost, 127.0.0.1, my_host 
    DEBUG=False 
    MY_DJANGO_KEY=no_peeking_this_is_secret 
    
  2. 使用decouple.config哪位會讓你的生活easier-閱讀you .env/.ini file:

    on settings.py

    from decouple import Csv, config 
    
    DEBUG = config('DEBUG', cast=bool, default=True) 
    A_NUMBER = config('A_NUMBER') # No cast needed! 
    ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv(), default='') 
    ... 
    

,讓你擁有多個.env.ini文件,爲每個可能的配置,你會不會擔心混合起來權限等

最後,我傾向於使用默認與可能的最低配額(例如。看看我的默認允許主機是一個空字符串)。
但是,如果存在這一定要設置正確,那麼一些非常重要的變量:

  • config()方法將引發UndefinedValueError如果一個變量是不確定的,未設置默認值。

  • 因此,我們可以創建一個try:... except:塊預期:

    try: 
        SUPER_IMPORTANT_VAR = config('SUPER_IMPORTANT_VAR') 
    except UndefinedValueError: 
        print('Hey!! You forgot to set SUPER_IMPORTANT_VAR!!') 
    
+0

謝謝!而不是混合權限(與我的用戶約翰的例子有關),我擔心有隱藏真正的錯誤的默認值。如果您在允許的主機中使用default ='',那麼該網站將無法工作,並且您會注意到,但是應該通過提高錯誤配置的err來更明確一些嗎?我正在考慮一個redis URL,一個緩存前綴,分頁大小,或者一些可能在以後才能使用的內容。 –

+0

如果你有一些你想絕對是一個設置變量,那麼你可以這樣做:'SUPER_IMPORTANT_VAR = config('SUPER_IMPORTANT_VAR')',如果變量未定義,會引發一個'UndefinedValueError'!我會編輯我的答案:) –

+0

啊我明白了!是的,我想專注於強化它,提前失敗並防止出現意外行爲或意外錯誤,而不是這個價值的來源。 –

相關問題