Skip to main content
 首页 » 编程设计

python之Django 设置 : raise KeyError, 引发 ImproperlyConfigured 或使用默认值

2024年10月01日37duanxz

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: block 来预测:

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