Установите переменные среды для Django на Dreamhost и Passenger WSGI

Я пытаюсь установить переменную среды для 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

superlists — это место, где находится проект. Итак, как мне установить переменные среды в этом случае?


person Dwaine    schedule 09.02.2018    source источник


Ответы (2)


Я нашел решение, читая Two Scoops of Django. 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": "[email protected]",
    "EMAIL_HOST_PASSWORD": "123456",
    "EMAIL_PORT": "000",
    "EMAIL_USE_TLS": "True"
}
person Dwaine    schedule 20.02.2018

Переменные среды предназначены для среды, поэтому я предполагаю, что вы запускаете свой сервер со сценарием. Предполагая, что в bash вы можете создать файл для примера

env_variables.sh

export SECRET_KEY=...
export DB_NAME=...
...

или сделайте то же самое в файле python с os.environ.

Затем в настройках приложения загрузите переменные среды, например, с os.environ.get('SECRET_KEY').

person Kryštof Řeháček    schedule 09.02.2018
comment
Спасибо за предложение. Насколько я знаю, Dreamhost не позволяет мне запускать сервер с какими-либо конкретными сценариями. Я нашел другой метод, который работает с использованием файла JSON. - person Dwaine; 21.02.2018