我试图为Django设置一个不在源代码中的环境变量,在这种情况下是一个电子邮件密码。这是我试图模仿的例子:
server: /etc/systemd/system/gunicorn-superlists-staging.ottg.eu.service
[Service]
User=elspeth
Environment=EMAIL_PASSWORD=yoursekritpasswordhere
WorkingDirectory=/home/elspeth/sites/superlists-staging.ottg.eu/source
该示例使用nginx和gunicorn,但我尝试使用Dreamhost,Linux和Passenger wsgi进行设置。
这是我的文件结构:
.
|-- \ ~
|-- __pycache__
|-- database
|-- etc
|-- passenger_wsgi.log
|-- passenger_wsgi.py
|-- passenger_wsgi.pyc
|-- public
|-- source
|-- static
|-- superlists
|-- testGoat
|-- tmp
`-- virtualenv
超级列表是项目所在的位置。那么,在这种情况下我该如何设置环境变量呢?
答案 0 :(得分:0)
环境变量是环境变量,因此我假设您使用脚本启动服务器。假设它在bash中你可以创建一个文件例子
<强> env_variables.sh 强>
export SECRET_KEY=...
export DB_NAME=...
...
或在os.environ
的python文件中执行相同操作。
然后在应用程序的设置中加载环境变量,例如{。{1}}。
答案 1 :(得分:0)
我在阅读Django的两个Scoops时找到了解决方案。 Apache不允许设置环境变量。相反,我将一个secrets.json文件添加到我的/ etc文件夹中,并使用设置中的方法从JSON文件中读取机密数据。这是方法的样子:
import os
# 2 Scoops 5.4.1, Env Varible Alternative
import json
from django.core.exceptions import ImproperlyConfigured
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# JSON-based secrets module (see 2 Scoops, 5.4.1)
with open(os.path.join(BASE_DIR, '../etc/secrets.json')) 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')
EMAIL_HOST = get_secret('EMAIL_HOST')
EMAIL_HOST_USER = get_secret('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = get_secret('EMAIL_HOST_PASSWORD')
EMAIL_PORT = get_secret('EMAIL_PORT')
JSON文件如下所示:
{
"FILENAME": "secrets.json",
"SECRET_KEY": "shhhh...it's a secret",
"DATABASES_HOST": "127.0.01",
"PORT": "5432",
"EMAIL_HOST": "smtp.email.com",
"EMAIL_HOST_USER": "name@email.com",
"EMAIL_HOST_PASSWORD": "123456",
"EMAIL_PORT": "000",
"EMAIL_USE_TLS": "True"
}