为什么 Django 找不到 secrets.json 文件?

Why can't Django find secrets.json file?

所以我有我的 Django 项目,并试图通过 heroku 服务器部署它。我意识到我需要创建 secrets.json 文件(在与 manage.py 相同的目录中),然后为了安全起见将其添加到 .gitignore。但是在部署项目之后,我得到一个错误,说它找不到 secrets.json 文件。下面是我的代码。
settings.py

secret_file = os.path.join(BASE_DIR, 'secrets.json')
with open(secret_file) as f:
    secrets = json.loads(f.read())

def get_secret(setting, secrets=secrets):
    try:
        return secrets[setting]
    except KeyError:
        error_msg = "Set the {} environment variable".format(setting)
        raise ImproperlyConfigured(error_msg)
SECRET_KEY = get_secret("SECRET_KEY")

secrets.json

{
    "SECRET_KEY" : xxx,
    "EMAIL_HOST_USER" : xxx,
    "EMAIL_HOST_PASSWORD" : xxx
}

保存这些后,我将secrets.json添加到.gitignore
但是在第 2 行(with open(secret_file) as f:)出现错误,说找不到 secrets.json 文件。你觉得问题是什么?

*仅供参考,BASE_DIR 似乎不是问题所在,因为它在其他地方工作正常。比如STATICFILES_DIRS.

您忽略您的机密文件是正确的。它不应该是你的存储库的一部分,也不应该发送到 Heroku。由于该文件未包含在您的源代码中,因此 Heroku 无法打开它。

据我所知,secrets.json 在 Django / Python 世界中并不常见。

我对此有点困惑:

def get_secret(setting, secrets=secrets):
    try:
        return secrets[setting]
    except KeyError:
        error_msg = "Set the {} environment variable".format(setting)
        raise ImproperlyConfigured(error_msg)

您的 KeyError 处理程序引用了环境变量。这是在正确的轨道上!使用环境变量配置您的应用程序一种常见模式。

但是名为 secrets.json 的 JSON 文件不是 environment variable。一种更常见的方法是直接从环境中加载设置文件中的值:

import os

SECRET_KEY = os.getenv("SECRET_KEY")

# You can even provide a default in case the environment variable isn't set:
ANOTHER_SETTING = os.getenv("ANOTHER_SETTING", default="some-default-value")

在 Heroku 上,您可以设置 config vars 将自动注入到您的环境中:

heroku config:set SECRET_KEY=some-value

这样就剩下本地开发了。有多种方法可以在您的本地计算机上设置环境变量,但一种常见的方法是创建一个名为 .env:

的文件
SECRET_KEY=xxx
EMAIL_HOST_USER=xxx
EMAIL_HOST_PASSWORD=xxx

如果您 运行 通过 heroku local it will automatically pick up your .env file. So will Pipenv, if you use that. There's also python-dotenv and direnv 和其他人在本地编写代码。

.env 文件已成为事实上的标准,与支持 secrets.json 文件的工具相比,您更有可能找到支持它们的工具。


¹ python-secrets,这可能会帮助您处理 secrets.json 个文件。不过,您似乎是在手动打开机密文件。

如果您打算继续使用您的机密文件,我建议您找到类似这样的东西,它可以自动读取文件并将设置合并到环境中。我从未使用过这个库,只是在回答这个问题时在搜索中遇到它。