在Dreamhost和Passenger WSGI上为Django设置环境变量

时间:2018-02-09 18:57:43

标签: django linux passenger dreamhost

我试图为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

超级列表是项目所在的位置。那么,在这种情况下我该如何设置环境变量呢?

2 个答案:

答案 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"
}