为什么 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
个文件。不过,您似乎是在手动打开机密文件。
如果您打算继续使用您的机密文件,我建议您找到类似这样的东西,它可以自动读取文件并将设置合并到环境中。我从未使用过这个库,只是在回答这个问题时在搜索中遇到它。
所以我有我的 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
个文件。不过,您似乎是在手动打开机密文件。
如果您打算继续使用您的机密文件,我建议您找到类似这样的东西,它可以自动读取文件并将设置合并到环境中。我从未使用过这个库,只是在回答这个问题时在搜索中遇到它。