Django 无法从 wsgi.py 更新环境变量

问题描述 投票:0回答:1

我有一个在生产中使用 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 中获取和设置环境变量的哪一部分?

python django apache environment-variables
1个回答
0
投票

我还不能完全解释为什么我的上面的代码无法设置环境变量,但是第 3 方库 python-dotenv 提供了一个解决方案。我执行了以下步骤:

  1. 使用 pip 安装 python-dotenv。
  2. 在我的项目根目录中创建一个“.env”文件。
  3. 向 .env 添加配置设置,例如:
    SECRET_KEY=mysecretkeyval
  4. 在我的
    settings.py
    文件中包括
    from dotenv import load_dotenv
  5. 在settings.py文件中,调用
    load_dotenv()
  6. 在settings.py中,设置应用程序变量:
    SECRET_KEY = os.environ.get('SECRET_KEY')

这个解决方案效果很好,但是如果我获得有关在 wsgi.py 中设置(或不设置)环境变量的更多具体信息,我将更新我的答案。

© www.soinside.com 2019 - 2024. All rights reserved.