【问题标题】:How to I hide my secret_key using virtualenv and Django?如何使用 virtualenv 和 Django 隐藏我的 secret_key?
【发布时间】:2025-11-28 07:50:02
【问题描述】:

我正在使用 DjangopythonvirtualenvvirtualenvwrapperVagrant .

到目前为止,我只是将secret_key 留在了settings.py 文件中。 这适用于本地文件。但是我已经将我的文件放在了 Git 中。我知道这对于生产(Apache)是不可接受的。

隐藏我的secret_key 的正确方法是什么?

我应该使用virtualenv 隐藏它吗?

【问题讨论】:

  • 我不确定 virtualenv 可以通过什么方式隐藏密钥。
  • 您有以下两种方法可以做到这一点。只是想指出一个警告:如果您现在在您的仓库中有您的密钥,请更改您的密钥!
  • @RyanO'Donnell 不过,只有当您的仓库是公开的时,这才是真正需要的。如果您的存储库仅在您的服务器上并且没有其他人可以访问,那还不错。如果它作为公共仓库在 GitHub 上,那就不好了。
  • 没错,但是,谁知道你将来会用它做什么:)

标签: python django virtualenv


【解决方案1】:

隐藏秘密的方法有很多种。

  1. 使用另一个非版本化文件。

    创建一个新文件secrets.py 或者你有什么,然后把你的秘密放进去。把它放在你的设置文件旁边,把所有秘密都放在里面;然后在您的设置文件中将from secrets import * 放在顶部。然后,就像 Rahul 说的,添加一个 .gitignore 文件并将 secrets.py 添加到这个文件中,这样它就不会被提交。

    这种方法的缺点是该文件根本没有源代码控制;如果你失去了它,你就是 SOL。

  2. 使用环境变量。

    使用 Apache SetEnv or PassEnv directives 将环境变量传递给您的进程,然后在您的设置文件中使用 os.environ() 检索它们。这样做的好处是,在开发过程中,您可以设置新变量(就像 VAR1=whatever VAR2=whatever ... ./manage.py runserver ... 一样简单)或从您用于启动开发项目的任何机制中设置它们。

    缺点也差不多;如果你丢失了你的 Apache 配置,你就完蛋了。

  3. 结合方法 1 使用第二个存储库。

    就个人而言,我喜欢拥有一个专用的secrets 存储库的想法,您可以将所有秘密放入其中并保持该存储库处于锁定状态。然后,作为部署过程的一部分,您可以使用 git archive 或其他类似命令为您要部署的位置提取正确的密钥,并且您可以轻松备份您的秘密并在版本控制下。您还可以将 secrets 存储库中的适当文件添加到站点存储库的 .gitingore 文件中,以免意外提交。

    这样做的缺点是您有另一个额外的存储库和另一个部署步骤。我个人认为这是值得的,但这完全取决于你。

一般来说,您希望它越安全,访问这些秘密就越不方便。不过,这确实是一般规则。

【讨论】:

  • 一旦你添加 from secrets import * 你如何访问 settings.py 中的变量?
【解决方案2】:

您可以创建一个名为secret_settings.py 的文件,并将您的SECRET_KEY 放在该文件中。然后将此文件添加到.gitignore。 然后在您的设置中,您可以删除密钥变量并从那里导入它。这应该确保SECRET_KEY 变量不受版本控制。

创建一个名为 secret_settings 的文件,然后将您的 SECRET_KEY 和其他机密设置放入其中。

SECRET_KEY = .. # add your setting here

然后在您的 settings.py 文件中,导入这些设置。

from secret_settings import *

最后,将secret_settings.py 添加到您的.gitignore 文件中。

注意:

如果您已经将一些敏感数据提交到您的存储库,请更改它!

根据Github网站removing sensitive data article

如果您提交了密码,请更改密码!如果您提交了密钥, 生成一个新的。

查看link,了解如何从存储库的历史记录中清除文件。

【讨论】:

  • 这个答案对我来说是最干净的方法!
  • @Rahul Gupta,我们不需要用于部署的密钥吗?
  • 对我来说,我需要在这部分添加一个点:from .secret_settings import *
【解决方案3】:

如果您想配置区域,但不想在 repo 中存储敏感信息,通常的方法是通过环境变量传递它。当您需要它时,只需致电os.environ('SECRET')(即使在您的settings.py 中)。有一些后备价值会更好。

Virtualenv 无法帮助您隐藏任何内容,它只是防止您在系统范围内安装的 Python 被一个项目所需的包乱扔。

【讨论】:

    【解决方案4】:

    我使用的解决方案是创建一个文件 sec.py 并将其放在我的 settings.py 文件旁边。然后在 settings.py 的第 1 行调用from .sec import *。确保在文件名前包含句点。请务必在 .gitignore 文件中列出 sec.py。

    【讨论】:

      最近更新 更多