【问题标题】:How to import environment variables to Django from local file如何从本地文件将环境变量导入 Django
【发布时间】:2019-09-24 10:26:03
【问题描述】:

我正在为我的第一个专业 Django 项目的生产做准备,但在保护应用程序的环境变量方面遇到了问题。到目前为止,我已经成功创建了一个本地文件来将所有变量存储在我的电脑上......

env_variables.py

import os

db_user = os.environ.get('db_user')
db_password = os.environ.get('db_password')

# AWS DJANGO
export AWS_ACCESS_KEY_ID = "access_key"
export AWS_SECRET_ACCESS_KEY = "secret_key"
export AWS_STORAGE_BUCKET_NAME = "bucket_name"

print(db_user)
print(db_password)

我使用环境设置(windows)来创建用户名和密码。当我运行文件时,它们工作。我正在使用我的 AWS 凭证对此进行测试。我一直认为 Django 可以访问这些信息,无论它在我的本地电脑上的什么位置。如果我错了,请纠正我。

settings.py

...

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')

...

我知道 Django 没有访问此文件,因为我的所有媒体文件都获得了 400,但是当我将密钥直接放入 settings.py 文件时它可以工作。我相信我在这里遗漏了几个步骤。我见过其他 python 编码器能够做到这一点,而不必使用 django-environ 或其他包之类的东西。如果有人可以提供帮助,将不胜感激,因为我想为我的所有项目都这样做。

编辑 我的 Procfile 的 gunicorn 是 web: gunicorn project_name.wsgi 我没有修改我的 wsgi 文件。

【问题讨论】:

  • 运行该文件不可能工作,因为它是 Python 和 bash 语法的混合体,并且在两者中都无效。
  • 你的 settings.py 文件没问题。正如@DanielRoseman 所说,您是 env_variables.py 文件没有意义。问题是如何设置环境变量。通常你会激活一个 virtualenv,并使用一个守护进程在该 virtualenv 中运行 gunicorn 或 uwsgi,并将这些特定的环境变量设置为你需要的值。例如如果您使用 systemd 启动 gunicorn,则在配置文件的 [Service] 部分中传递 Environment 设置。
  • 所以你应该用你如何运行 Django (gunicorn/uwsgi) 以及如何配置来扩展你的问题。
  • 当我在终端中运行“python env_vars.py”时,它会打印我的用户名和密码。我在这里是不是偶然混合了学科?
  • 是否需要将所有机密文件放在 .py 文件中?如果没有,您可以使用 python-dotenv 从 .env 文件加载环境变量。将一个简单的脚本添加到您的 manage.py 和 wsgi.py 中,您就可以让它在 django 上运行。

标签: python django environment-variables


【解决方案1】:

我建议您使用django-environ 来配置您的应用。 将所有配置值保存在一个单独的文件中,例如 .env - 这不应该添加到存储库中。

.env

AWS_ACCESS_KEY_ID = "access_key"
AWS_SECRET_ACCESS_KEY = "secret_key"
AWS_STORAGE_BUCKET_NAME = "bucket_name"

现在在您的 Django settings.py 中加载 env 文件并使用相应的键。

settings.py

import environ
env = environ.Env()
env.read_env(env.str('ENV_PATH', '/path/to/.env'))
AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME')

【讨论】:

  • 如何将其扩展到其他文件,比如local_utils.py - 我得到一个Set the <variable_name> environment variable。我可以从settings.py 访问它,但不能从(自写的)utils-function
猜你喜欢
  • 2011-09-11
  • 2018-05-31
  • 2013-06-24
  • 2020-03-22
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2016-03-01
相关资源
最近更新 更多