用独特的SECRET_KEY分配Django项目

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

我怎样才能避免settings.SECRET_KEY每个安装相同的问题?

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

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

谢谢!

我会这样做:

把秘密密钥放在一个单独的文件“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 

您将要编写的函数generate_secret_key(filename)将生成一个名为filename (我们称之为secret_key.py ,位于settings.py的相同目录中),其内容如下:

 SECRET_KEY = '....random string....' 

其中随机string是基于随机数生成的密钥。

对于密钥生成,您可以使用Umang的build议https://stackoverflow.com/a/16630719/166761

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

 from django.utils.crypto import get_random_string chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)' get_random_string(50, chars) 

一般来说,您可以将Djangoconfiguration分为特定于应用程序的事物和特定于服务器的事物。 这属于后一类。

有很多方法可以解决服务器特定的configuration问题,在这个问题上讨论更多。

对于这个特定的实例,使用我在回答其他问题时概述的方法,我将settings_local.py.sample一个占位符用于分发,在安装期间,我将它复制到settings_local.py并编辑为适合。

我会解决这样的问题:

  • 提供一个虚拟密钥,如: I_AM_A_DUMMY_KEY_CHANGE_ME
  • 创build一个pipe理命令来生成一个新的: ./manage.py gen_secret_key
  • 在文档中,强烈build议用户尽快运行该命令

在我的代码中,我有三个级别的设置文件,受Django的两个Scoops的启发,所以中间的一个就像这样,在基本模板中设置BASE_PRIVATE_DIR。 在我的情况下,这是从django目录../../mysite_private但在应用程序git下的普通文件的外侧:

 from .base import * ALLOWED_HOSTS = ['staging.django.site'] #Allow local override which is per deployment instance. There should probably then be # an instance git for version control of the production data try: import sys private_path = BASE_PRIVATE_DIR.child('production') sys.path.append(private_path) from private_settings import * except ImportError: print(" No production overide private_settings.py found. This is probably an error = {}".format(private_path)) # If it doesnt' exist that is fine and just use system and environment defaults 

如果你使用模板创build一个新项目,比如django-admin.py startproject --template=path_to_template project_name ,就把{{ secret_key }}放到你的项目模板设置文件(例如settings.py)中,像SECRET_KEY = '{{ secret_key }}'和Django会为你生成它。