当前位置: 首页 > 知识库问答 >
问题:

Django os.getenv('SECRET_KEY ')抛出“SECRET_KEY设置不能为空。”

海保臣
2023-03-14

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

共有3个答案

单于耘豪
2023-03-14

要从 Docker 或我使用的 AWS 弹性豆茎中获取环境变量,请使用 os.environ.get('SECRET_KEY'),这通常比 os.environ ['SECRET_KEY'] 更可靠。

姬国安
2023-03-14

我正在使用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()
阎英朗
2023-03-14

您可以使用python解耦来获取存储在.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)

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

 类似资料:
  • 问题内容: 我正在尝试设置包括一些基本设置的多个设置文件(开发,生产等)。虽然无法成功。当我尝试运行时,出现以下错误: 这是我的设置模块: 基本设置(包含SECRET_KEY): 设置文件之一: 代码在manage.py: 如果添加到(否则为空),它会神奇地开始工作,但我不明白为什么。任何人都可以向我解释这是怎么回事?它一定是一些python模块魔术。 编辑:如果我从base.py删除此行,一切也

  • 问题内容: 我做了一些Google搜索,并检查了文档(https://docs.djangoproject.com/en/dev/ref/settings/#secret- key ),但是我正在寻找对此的更深入的说明,以及为什么需要它。 例如,如果密钥被泄露/其他人知道密钥是什么,会发生什么? 问题答案: 它用于制作哈希。看:

  • 问题内容: 我正在尝试设置Flask-Debugtoolbar,但收到消息“ DebugToolBar需要SECRET_KEY”。我从哪里获得密钥? 问题答案: 该 密钥 是需要保持客户端会话安全。您可以生成一些随机密钥,如下所示: 只需获取该密钥并将其复制/粘贴到您的配置文件中 请参阅会议文档

  • 在try块中为未抛出异常子类的方法捕获异常,将无法编译。当我捕捉到异常时,它起作用了。它是如何工作的??

  • 下面是我的代码。当我运行它时,我在线程“main”java.lang.IndexOutOfBoundsException:Index:3、Size:2中得到异常,而不是我的异常消息。谁能解释一下我做错了什么,为什么会这样?谢谢!

  • 问题内容: 直接的答案是因为s接口被指定为不会引发异常。但是为什么呢? 或换句话说:我必须依赖可以引发异常的函数。从理论上讲,这不应该发生。但是,如果发生这种情况,我希望它脱离我正在使用的整个函数(在中)。即我希望它的行为就像发生未处理的异常一样。 似乎这不可能以一种显而易见的自然方式进行(因为如果接口说它不能抛出异常,就不会)。 我该如何解决?用丑陋的try / catch并打印出异常,并希望我