【问题标题】:Django os.getenv('SECRET_KEY') throwing "The SECRET_KEY setting must not be empty."Django os.getenv('SECRET_KEY') 抛出“SECRET_KEY 设置不能为空。”
【发布时间】:2021-06-18 14:56:27
【问题描述】:

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

【问题讨论】:

  • 你在manage.py中写过如何找到你的.env文件吗? (通常人们会忘记这样做)
  • @alv2017 不,我不知道你必须编辑manage.py。你能举个例子吗?
  • 如果您无法安装额外的软件包,那么您必须在运行 manage.py 之前获取 .env (source .env) 文件。

标签: django virtualenv django-settings


【解决方案1】:

您可以使用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)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我相信这可能会完成工作,但在我的情况下,我需要它而不使用 dotenv,只需要没有额外包的 python
    • 关键是在 Django 中你需要告诉 Django app .env 文件在哪里,否则它没有任何线索。 dotenv 包的工作是 a) 找到 .env 文件; b) 将 .env 中的变量读入操作系统环境变量。看看 dotenv 包,有很多,即使你不愿意使用它们,你也可以了解它们是如何做到的。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-06-04
      • 1970-01-01
      • 2016-12-25
      • 2013-10-08
      • 2017-10-03
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多