Почему 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)
...
Вернуться на верх