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

Posted

技术标签:

【中文标题】Git/Heroku - 如何隐藏我的 SECRET_KEY?【英文标题】:Git/Heroku - How to hide my SECRET_KEY? 【发布时间】:2018-06-05 13:13:40 【问题描述】:

我正在使用 Python 和 Django 创建 Heroku Web 应用程序,而 Heroku 在尝试执行此操作时在命令“git push heroku master”后给了我这个错误: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'

问题是,当我在本地服务器(即http://127.0.0.1:8000/)上测试我的 Web 应用程序时,它可以工作,但是当我将这些更改推送到 Heroku 时,它不起作用。正如你所看到的,根据其他人的建议,我想要做的就是隐藏我的 SECRET_KEY。我看过其他人的建议,我似乎无法弄清楚,选择这种方法是因为它可以理解。非常令人沮丧。非常感谢初学者友好的答案/步骤。

【问题讨论】:

【参考方案1】:

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

Heroku 部署由 Git 提供支持。由于 Git 不跟踪 secret_settings.py,因此它不会被推送到 Heroku。您可以将该文件添加到您的存储库中,但这会破坏首先拥有一个单独的未跟踪文件的目的。

解决方案是使用environment variable。这是well-supported on 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') 吗?我想问题真的是os.getenv 中的第一个参数是否是网络应用程序上only 真实的SECRET_KEY(如果包含),但如果不包含它并且您在开发机器上,它会而是使用第二个参数? @reedx8,如果您将真正的密钥作为第二个参数包含在内,它将在您的公共存储库中对全世界可见。这可能不是你想要的。您可以使用os.getenv('SECRET_KEY'),但您需要在所有环境(您的开发机器、您可能拥有的任何测试或暂存环境等)中设置一个SECRET_KEY环境变量.包含一个虚拟值作为默认值可能更容易,尽管当然可以在任何地方设置环境变量。我为os.getenv() 添加了指向文档的链接。

以上是关于Git/Heroku - 如何隐藏我的 SECRET_KEY?的主要内容,如果未能解决你的问题,请参考以下文章

未能将一些参考资料推送到 git@heroku.com

Git / heroku梦魇似乎无法重置为之前的提交

使用 git-tracked heroku 项目时如何安全地存储 .pem 文件?

“github”和“git heroku”同时保存的简单方法

Heroku 中的路径无效

推送到Heroku时Ruby on Rails错误