用独特的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会为你生成它。