在我的远程服务器上,运行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"
答案 0 :(得分:1)
最终,下面是我解决问题的方法。可以帮助别人。灵感来自两个独家新闻的例子
简短步骤:
我将文件放在本地和远程计算机的〜/ .env中,内容为
{
"SECRET_KEY": "my_secret_key",
"DB": "db_name",
"USER": "db_user",
"USER_PW": "db_user_password",
"EMAIL": "email@email.com",
"EMAIL_PW": "password"
}
如果您的应用没有发送任何电子邮件,您可能不需要上面代码段中的最后两行
在我的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')
依旧......
答案 1 :(得分:-3)
这是一个NGINX“问题”。当NGINX启动时,它会擦除除时区之外的所有环境变量。您可以使用NGINX配置文件手动设置环境变量。但当然,数据将在该配置文件中以明文形式显示。