簡體   English   中英

Django os.getenv('SECRET_KEY') 拋出“SECRET_KEY 設置不能為空。”

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

我正在使用 os.getenv 設置os.getenv以准備使用 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-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)

注意:要應用更改,您需要重新啟動服務器。

我正在使用 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()

通過docker-compose部署時,可以在容器設置[web]中的docker-compose file.bml中指定:

web:

...

環境文件:

-./.env

它在不使用額外包的情況下對我有用。 在我的例子中,file.env 位於 docker-compose.yml 所在的目錄中

要從 docker 或 AWS Elastic Beanstalk 獲取環境變量,我使用os.environ.get('SECRET_KEY') ,這通常比os.environ['SECRET_KEY']更可靠

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM