Git/Heroku - 如何隐藏我的SECRET_KEY?

10

我正在使用Python和Django创建一个Heroku Web应用程序,当我执行“git push heroku master”命令时,Heroku会给出以下错误:ModuleNotFoundError: No module named 'dlist.secret_settings',尝试执行以下操作:

#settings.py
from .secret_settings import *  
# from secret_settings.py import * doesn't work for some reason.

以下是 secret_settings.py 文件的内容(该文件与 settings.py 在同一文件夹中):
#secret_settings.py
SECRET_KEY = 'string here'

问题是,当我在本地服务器上测试我的Web应用程序时(即http://127.0.0.1:8000/),这个方法有效,但是当我将这些更改推送到Heroku时,它就无法工作了。我只想隐藏我的SECRET_KEY,按照其他人的建议,如您所见。我已经查看了其他人的建议,但似乎无法解决问题,因此选择了这种方法,因为它易于理解。非常令人沮丧。非常感谢初学者友好的答案/步骤。
1个回答

20

我猜你已经配置了Git来忽略secret_settings.py。这是我能想到的创建单独文件的唯一原因。

Heroku部署由Git驱动。由于secret_settings.py没有被Git跟踪,因此不会推送到Heroku。您可以将该文件添加到存储库中,但这将违反首先拥有单独未跟踪文件的目的。

解决方法是使用环境变量。这在Heroku上得到了很好的支持

在您的settings.py文件中,使用os.getenv()设置您的SECRET_KEY,如下所示:

import os

SECRET_KEY = os.getenv('SECRET_KEY', 'Optional default value')

这会告诉 Django 从名为 SECRET_KEY 的环境变量中加载你的 SECRET_KEY 设置,如果没有这样的环境变量,则退回到可选的默认值。在开发机器上,使用默认值可能是可以的。

最后,在 Heroku 上设置 SECRET_KEY 环境变量。您可以通过在开发计算机上运行 heroku config:set SECRET_KEY="YOUR_SECRET_KEY_VALUE" 或通过 Heroku 的基于 Web 的仪表板来完成此操作。

不再需要您的 secret_settings.py 文件。


谢谢Chris,这对我帮助很大,文档对我来说不太清楚。我的一个后续问题是,如果我将原始的SECRET_KEY包含在os.getenv的第二个参数中(即可选的默认值),是否安全,如果我将其提交到公共存储库中?如果不安全,我应该只在settings.py中使用SECRET_KEY = os.getenv('SECRET_KEY')吗?我想问题的关键是,如果在Web应用程序中包含第一个参数,它是否是唯一真实的SECRET_KEY,但如果没有包含它并且您在开发机器上,则会使用第二个参数? - xv8
@reedx8,如果你将真实的密钥作为第二个参数包含在你的公共代码库中,那么它将对所有人可见。这可能不是你想要的。你可以使用 os.getenv('SECRET_KEY'),但是你需要在 所有 的环境中(包括开发机器、任何测试或暂存环境等)设置一个 SECRET_KEY 环境变量。虽然在所有地方设置环境变量也是有可能的,但是将一个虚假值作为默认值可能更容易些。我已经添加了关于 os.getenv() 文档的链接。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接