使用唯一的SECRET_KEY分发Django项目

mwc*_*wcz 53 django

我有一个Django项目,我想在像bitbucket或github这样的公共存储库上发布.我希望它尽可能容易安装,所以我要包括完整的项目,而不仅仅是可插拔的应用程序.这意味着该settings.py文件也将被包含在内.

如何避免settings.SECRET_KEY每次安装都一样的问题?

是用户手动修改的唯一简单解决方案settings.py吗?

我应该将密钥存储在默认数据库中,settings.py如果它不存在则进行初始化吗?这将解决问题,但我想知道是否已经有一种标准的方法来做到这一点.

谢谢!

Uma*_*ang 87

要添加到CarlesBarrobés所说的内容,您可以使用Django使用的方法startproject生成一个新密钥:

from django.utils.crypto import get_random_string

chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
get_random_string(50, chars)
Run Code Online (Sandbox Code Playgroud)

对于Django 1.10及更高版本,上面的代码片段很好地包含在一个函数中.

from django.core.management.utils import get_random_secret_key
get_random_secret_key()
Run Code Online (Sandbox Code Playgroud)

链接到GitHub回购

  • 如果你把它放在你的项目中,你拥有的每个单独的 Django 进程都会有一个不同的键。这意味着,例如,如果您运行多个并发 Django 进程(或在单独的服务器中),它们将获得不同的密钥,因此从一个实例签名的内容将无法在另一个实例上运行。此外,当您的 Django 进程重新启动时,您将获得一个新的密钥,从而导致类似的问题。 (3认同)

Car*_*bés 41

我会这样做:

将密钥放在单独的文件"secret_key.py"中.原始安装不存在此文件.在您的settings.py中包含以下内容:

try:
    from .secret_key import SECRET_KEY
except ImportError:
    SETTINGS_DIR = os.path.abspath(os.path.dirname(__file__))
    generate_secret_key(os.path.join(SETTINGS_DIR, 'secret_key.py'))
    from .secret_key import SECRET_KEY
Run Code Online (Sandbox Code Playgroud)

generate_secret_key(filename)您将编写的函数生成一个名为filename(我们称之为与其secret_key.py相同的目录settings.py)的文件,其中包含以下内容:

SECRET_KEY = '....random string....'
Run Code Online (Sandbox Code Playgroud)

其中随机字符串是基于随机数生成的密钥.

对于密钥生成,您可以使用Umang的建议/sf/answers/1164150361/.

  • 此方法还要求加载`settings.py`模块的用户对其所在的目录具有写访问权. (2认同)

Eva*_*van 21

打开一个Django shell,python manage.py shell并执行以下操作在Django 2.1中创建一个安全的随机密钥:

>>> from django.core.management.utils import get_random_secret_key
>>> get_random_secret_key()
'[GENERATED KEY]'
>>>
Run Code Online (Sandbox Code Playgroud)

注意:>>>表示shell提示符,不应键入.

  • 谢谢埃文!我正在搜索此功能。适用于Django 2.2。 (2认同)

Jim*_*Jim 5

一般来说,您可以将Django配置划分为特定于应用程序的内容和特定于服务器的内容.这属于后一类.

有许多方法可以解决特定于服务器的配置问题,本问题对此进行更多讨论.

对于这个特定的例子,使用我在回答另一个问题时所提出的方法,我将一个占位符放入settings_local.py.sample发行版中,在安装过程中,我会将其复制到settings_local.py并编辑以适应.