我有一个在生产中使用 Apache 的 Django 应用程序。我将 Django 密钥值存储在外部文件中,在启动时从该文件应用密钥。我在应用程序配置文件中使用 SetEnv 指令让 Apache 知道文件的位置:
SetEnv DJANGO_KEY_LOC /data/www/ref/.myKey
我在 wsgi.py 中编写了一个函数,用于从 Apache 环境变量获取路径,并将其中的键值应用到 settings.py 中的 SECRET_KEY 设置。如果代码找不到该变量,它会从我用于开发的操作系统环境变量中提取位置
DJANGO_KEY='/data/www/ref/.myKey
:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myApp.settings')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myApp.settings'
_application = get_wsgi_application()
def application(environ, start_response):
try:
# DJANGO_KEY_LOC set in Apache conf for prod.
file_loc = environ['DJANGO_KEY_LOC']
with open(file_loc, 'r') as f:
os.environ['SECRET_KEY'] = f.read()
except KeyError:
# if key missing in environ try dev settings
print('running in dev environment...')
dev_file_loc = os.getenv('DJANGO_KEY')
with open(dev_file_loc, 'r') as f:
os.environ['SECRET_KEY'] = f.read()
return _application(environ, start_response)
该函数可以很好地检索键值,但无法设置 os.environ['SECRET_KEY']。 settings.py 中的代码是
SECRET_KEY = os.environ['SECRET_KEY']
。除非我事先为 SECRET_KEY 提供虚拟值,否则应用程序无法加载,但虚拟值永远不会更改。我在 python 解释器中外部测试了 set/get 代码,效果很好。我缺少在 Django 中获取和设置环境变量的哪一部分?
我还不能完全解释为什么我的上面的代码无法设置环境变量,但是第 3 方库 python-dotenv 提供了一个解决方案。我执行了以下步骤:
SECRET_KEY=mysecretkeyval
settings.py
文件中包括 from dotenv import load_dotenv
load_dotenv()
SECRET_KEY = os.environ.get('SECRET_KEY')
。这个解决方案效果很好,但是如果我获得有关在 wsgi.py 中设置(或不设置)环境变量的更多具体信息,我将更新我的答案。