Django os.getenv('SECRET_KEY') 投掷 "The SECRET_KEY setting must not be empty."

Django os.getenv('SECRET_KEY') throwing "The SECRET_KEY setting must not be empty."

我正在使用 os.getenv 设置 Django 以准备使用 Docker 进行部署,但它似乎没有读取 .env 文件。知道为什么不读吗?

设置如下:

.env

SECRET_KEY=foo
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1

settings.py抽象

import os
from pathlib import Path


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = os.getenv('SECRET_KEY')
DEBUG = os.getenv('DEBUG')
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS')

我正在使用 python-dotenv 来实现 dotenv 功能。如果你想让 Django 找到你的 .env 文件,你需要修改 manage.py 和 wsgi.py 文件。

# manage.py
import os
import sys
import dotenv


def main():
    """Run administrative tasks."""

    # dotenv settings
    dotenv.load_dotenv(
        os.path.join(os.path.dirname(__file__), '.env')
    )
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')

    if os.getenv('DJANGO_SETTINGS_MODULE'):
        os.environ['DJANGO_SETTINGS_MODULE'] = os.getenv('DJANGO_SETTINGS_MODULE')

    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()
# wsgi.py

import os
import dotenv

from django.core.wsgi import get_wsgi_application

# dotenv settings
dotenv.load_dotenv(
    os.path.join(os.path.dirname(os.path.dirname(__file__)), '.env')
)

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')

if os.getenv('DJANGO_SETTINGS_MODULE'):
 os.environ['DJANGO_SETTINGS_MODULE'] = os.getenv('DJANGO_SETTINGS_MODULE')

application = get_wsgi_application()

您可以使用 python-decouple 将环境变量存储在您项目的根目录中的 .env 文件中。

from decouple import config

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
EMAIL_HOST = config('EMAIL_HOST', default='localhost')
EMAIL_PORT = config('EMAIL_PORT', default=25, cast=int)

注意:要应用更改,您需要重新启动服务器。

从 docker 或我使用的 AWS Elastic Beanstalk 获取环境变量 os.environ.get('SECRET_KEY'),这个一般比os.environ['SECRET_KEY']

靠谱