Почему Environ не устанавливает переменную в корне проекта Django, отличном от главного?
Итак, у меня есть файл .env в корне моего проекта Django, содержащий несколько переменных.
Когда я использую их в одном корне проекта (например, в settings.py), все работает, но когда я пытаюсь получить доступ к переменной в другом корне/модуле, происходит сбой:
# other root than .env
import environ
# Initialise environment variables
env = environ.Env()
environ.Env.read_env()
# Get the iCloud application password via env
mail_password = env('MAIL_PW')
# --> returns django.core.exceptions.ImproperlyConfigured: Set the MAIL_PW environment variable
Однако это работает:
# same root as .env
import os
import environ
# Initialise environment variables
env = environ.Env()
environ.Env.read_env()
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')
Ваш первый код не работает, потому что environ.Env.read_env
не может найти .env
файл.
Вот источник
@classmethod
def read_env(cls, env_file=None, overwrite=False, **overrides):
"""Read a .env file into os.environ.
If not given a path to a dotenv path, does filthy magic stack
backtracking to find the dotenv in the same directory as the file that
called read_env.
...
В директории с вашим модулем нет .env
файла и read_env
не может его импортировать.
Вы можете просто импортировать все ваши .env
переменные в settings.py
, как предложено в документации. Затем вы можете импортировать настройки в другие модули
settings.py
import os
import environ
# Initialise environment variables
env = environ.Env()
environ.Env.read_env()
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')
module.py
from settings import SECRET_KEY
print(SECRET_KEY)
...