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 甚至可能同时存在于本地和远程,但具有不同的权限。它看起来不是很坚固。
请您参考如下方法:
我会建议对您正在做的事情采用不同的方法。
我使用以下流程:
创建一个包含您的环境变量的
.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使用
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!!')
