Django 设置:引发 KeyError、引发 ImproperlyConfigured 或使用默认值?

Django settings: raise KeyError, raise ImproperlyConfigured or use defaults?

Django 希望您使用 settings.py 中的环境变量来适应多种环境(例如本地、heroku、AWS)。

我想我应该在环境变量 DB_USERNAME 中定义 - 例如 - 数据库的用户名。我该如何阅读?

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 吗? 我更喜欢让应用程序停止而不是 运行 使用不正确的设置(默认设置,人们忘记设置变量等)。

在默认情况下,john 甚至可能同时存在于本地和远程,但具有不同的权限。看起来不是很结实。

我建议您采用不同的方法来处理您正在做的事情。

我使用以下流程:

  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——这会让你的生活更轻松——阅读你.env/.ini文件:

    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!!')