在我的远程服务器上,运行 Ubuntu 14.04,服务器配置为:Django、Nginx 和 Gunicorn,尽管在正确的用户下设置并重启了服务器,但我无法访问环境变量。
在我的本地机器上,我设置了环境变量,django 可以在启动期间访问并且运行良好。在远程服务器上,虽然环境变量已经到位,但 django 提示 keyerror。
# from two scoops
import os
from django.core.exceptions import ImproperlyConfigured
def get_env_variable(var_name):
"""Get the environment variable or return exception"""
try:
return os.environ[var_name]
except KeyError:
error_msg = "Set the {} environment variable".format(var_name)
raise ImproperlyConfigured(error_msg)
在服务器上,运行 django 实例的用户与设置环境变量的用户相同。
一切都在本地 PC 上运行。在远程机器上,它没有。我已经重新启动了服务器,仍然如此。
当我在远程服务器的终端中运行 export
时,我得到了环境变量列表,包括我自定义设置的内容。
为了确认,我进入了python进行验证。
import os
os.environ['THE_CUSTOM_KEY']
>> returns the Key
如果 Django 是 Python,那么我缺少哪一步,因为 python 会看到环境变量?
编辑:我在用户帐户的~/.profile
文件中设置变量。
我的 ~/.profile 和变量
# top part cut for brevity
export LOG_ECG_DB="name"
export LOG_ECG_EMAIL="email@gmail.com"
export LOG_ECG_EMAIL_PW="password"
export LOG_ECG_PW="password"
export LOG_ECG_SECRET="secret_key"
最佳答案
最终,下面是我解决问题的方法。可能会帮助某人。受两勺示例的启发
简要步骤:
- 在 ~/.env 中创建了一个 json 文件
- 让 settings.py 在加载时读取 json 文件
- 文件中的 key 用于填写敏感部分
创建json文件
我将文件放在本地和远程机器的 ~/.env 中,内容为
{
"SECRET_KEY": "my_secret_key",
"DB": "db_name",
"USER": "db_user",
"USER_PW": "db_user_password",
"EMAIL": "email@email.com",
"EMAIL_PW": "password"
}
如果您的应用不发送任何电子邮件,您可能不需要上面代码段中的最后两行
读取json
在我的 settings.py 中(或者您可以放入 utils.py 文件,随便什么),我有这个片段:
import json
from os.path import expanduser
from django.core.exceptions import ImproperlyConfigured
# with this, no need to hardcode
# home directory
home_directory = expanduser("~")
with open(home_directory + "/.env") as f:
secrets = json.loads(f.read())
def get_secret(setting, secrets=secrets):
"""Get the secret variable or return explicit exception."""
try:
return secrets[setting]
except KeyError:
error_msg = "Set the {0} environment variable".format(setting)
raise ImproperlyConfigured(error_msg)
填空
像这样 SECRET_KEY = get_secret('SECRET_KEY')
等等..
关于python - 无法访问环境变量远程服务器 Django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32158420/