В этом руководстве Django мы рассмотрим создание переменной среды для хранения паролей, ключей и других конфиденциальных объектов, а также будем запускать эту переменную среду на Windows.
Предисловие
Сам Python работать с переменными средами может, есть встроенный модуль os
, у которого есть метод environ.get()
. Но допустим вы подготовили Django проект к деплою, и необходимые параметры в settings.py зашифровали в os.environ.get('ExampleKey')
, и тут хотите запустить все на вашем компьютере с Windows в IDE PyCharm, как сталкиваетесь с ошибками:
File "C:\Users\Razilator\Desktop\Projects\notehunter\backend\engine\settings.py", line 29, in <module>
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS').split()
AttributeError: 'NoneType' object has no attribute 'split'
Ошибка эта появляется, потому что значение ALLOWED_HOSTS
- пустое, хотя в файле .env мы все добавляли, да и на VDS все работает как надо. Оно не читается с помощью Windows.
.env
ALLOWED_HOSTS=127.0.0.1
Создание .env и подключение
Чтобы наш .env работал везде, где мы захотим: Windows, Linux, и т.д., нам необходимо установить модуль django-environ
Для этого в терминале установим django-environ:
pip install django-environ
Результат установки:
(venv) PS C:\Users\Razilator\Desktop\Projects\Courses\App\backend> pip install django-environ
Collecting django-environ
Downloading django_environ-0.9.0-py2.py3-none-any.whl (17 kB)
Installing collected packages: django-environ
Successfully installed django-environ-0.9.0
Отлично. Мы установили его. Давайте взглянем на примерный .env файл для локальной машины.
Я расположил файл .env.local в папке docker/env/env.local. Вы можете расположить его в любом другом месте.
docker/env/env.local:
DJANGO_SECRET_KEY=django-insecure-e5wl)ln9l6f2dwsv2xt*2=*nez(bq7qj5c(2m1bcbojxlql_jy
DJANGO_DEBUG=0
CSRF_TRUSTED_ORIGINS=http://127.0.0.1
ALLOWED_HOSTS=127.0.0.1
POSTGRES_USER=postgres
POSTGRES_PASSWORD=root
POSTGRES_DB=ExampleDB
POSTGRES_HOST=127.0.0.1
POSTGRES_PORT=5432
CELERY_BROKER_URL=redis://127.0.0.1:6379/0
CELERY_RESULT_BACKEND=redis://127.0.0.1:6379/0
REDIS_LOCATION=redis://127.0.0.1:6379/1
RECAPTCHA_PUBLIC_KEY=6Cc3Z1AhAAAAACf7fNueWxIXWjH117-vgbXGyykB
RECAPTCHA_PRIVATE_KEY=6Cc3Z1AhAAAAAAOjLoGOWA_kljGQaYO2CXGDt0ro
EMAIL_HOST=ad.notehunter@yahoo.com
EMAIL_PORT=465
EMAIL_USE_SSL=1
EMAIL_HOST_USER=smtp.mail.yahoo.com
EMAIL_HOST_PASSWORD=cgigetffshgewq
Вы можете подставить свои значения, какие вам будут необходимы.
Теперь я перейду в файл settings.py для настройки виртуального окружения:

import environ
env = environ.Env()
environ.Env.read_env(env_file=Path('docker/env/.env.local'))
Пояснение:
- В
env_file
я добавляюPath('путь к файлу env')
И теперь, где мне необходимо изменить значения на конфиденциальные, ключи, пароли в settings.py:
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('DJANGO_SECRET_KEY')
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = int(env('DJANGO_DEBUG', default=0))
ALLOWED_HOSTS = env('ALLOWED_HOSTS').split()
CSRF_TRUSTED_ORIGINS = env('CSRF_TRUSTED_ORIGINS').split()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': env('POSTGRES_DB'),
'USER': env('POSTGRES_USER'),
'PASSWORD': env('POSTGRES_PASSWORD'),
'HOST': env('POSTGRES_HOST'),
'PORT': env('POSTGRES_PORT'),
}
}
EMAIL_HOST = env('EMAIL_HOST')
EMAIL_PORT = env('EMAIL_PORT')
EMAIL_USE_SSL = int(env('EMAIL_USE_SSL', default=1))
EMAIL_HOST_USER = env('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD')
RECAPTCHA_PUBLIC_KEY = env('RECAPTCHA_PUBLIC_KEY')
RECAPTCHA_PRIVATE_KEY = env('RECAPTCHA_PRIVATE_KEY')
CELERY_BROKER_URL = env('CELERY_BROKER_URL')
CELERY_RESULT_BACKEND = env('CELERY_RESULT_BACKEND')
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
"LOCATION": env('REDIS_LOCATION'),
}
}
И запущу проект через кнопку запуска в PyCharm:

И как видите, сервер успешно запущено с переменными из нашей переменной среды!
