这并不安全,任何有权访问您的源代码控制的人现在都可以访问您的数据库。
存储敏感数据的两种主要方法是使用环境变量或通过 json 文件
摘自Settings - Hiding secret data using a JSON file。原作者是Antoine Pinsard 和fredley。归属细节可以在contributor page 上找到。该源在CC BY-SA 3.0 下获得许可,可以在Documentation archive 中找到。参考主题 ID:942 和示例 ID:8734。
使用 JSON 文件隐藏机密数据
在使用诸如 Git 或 SVN 之类的 VCS 时,有一些机密数据永远不能进行版本控制(无论存储库是公共的还是私有的)。
在这些数据中,您可以找到SECRET_KEY 设置和数据库密码。
从版本控制中隐藏这些设置的常见做法是在项目的根目录 (thanks "Two Scoops of Django" for the idea) 创建一个文件 secrets.json:
{
"SECRET_KEY": "N4HE:AMk:.Ader5354DR453TH8SHTQr",
"DB_PASSWORD": "v3ry53cr3t"
}
并将其添加到您的忽略列表中(.gitignore 用于 git):
*.py[co]
*.sw[po]
*~
/secrets.json
然后将以下函数添加到您的settings 模块:
import json
import os
from django.core.exceptions import ImproperlyConfigured
with open(os.path.join(BASE_DIR, 'secrets.json')) as secrets_file:
secrets = json.load(secrets_file)
def get_secret(setting, secrets=secrets):
"""Get secret setting or fail with ImproperlyConfigured"""
try:
return secrets[setting]
except KeyError:
raise ImproperlyConfigured("Set the {} setting".format(setting))
然后以这种方式填写设置:
SECRET_KEY = get_secret('SECRET_KEY')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgres',
'NAME': 'db_name',
'USER': 'username',
'PASSWORD': get_secret('DB_PASSWORD'),
},
}
致谢:Two Scoops of Django: Best Practices for Django 1.8, by Daniel Roy Greenfeld and Audrey RoyGreenfeld. Copyright 2015 Two Scoops Press (ISBN 978-0981467344)
摘自Settings - Using Environment variables to manage Settings across servers。原作者是sudshekhar、ssice 和NBajanca。归属细节可以在contributor page 上找到。该源在CC BY-SA 3.0 下获得许可,可以在Documentation archive 中找到。参考主题 ID:942 和示例 ID:3580。
使用环境变量跨服务器管理设置
如The Twelve-Factor App 所述,使用环境变量是一种广泛使用的根据应用环境设置应用配置的方法。
由于部署环境之间的配置可能会发生变化,因此这是一种非常有趣的方式来修改配置,而无需挖掘应用程序的源代码,以及在应用程序文件和源代码存储库之外保密。
在 Django 中,主要设置位于项目文件夹中的settings.py。由于它是一个简单的 Python 文件,因此您可以使用标准库中 Python 的 os 模块来访问环境(甚至具有适当的默认值)。
settings.py
>
import os
SECRET_KEY = os.environ.get('APP_SECRET_KEY', 'unsafe-secret-key')
DEBUG = os.environ.get('DJANGO_DEBUG', "True") == "True"
ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS', '').split()
DATABASES = {
'default': {
'ENGINE': os.environ.get('APP_DB_ENGINE', 'django.db.backends.sqlite3'),
'NAME': os.environ.get('DB_NAME', 'db.sqlite'),
'USER': os.environ.get('DB_USER', ''),
'PASSWORD': os.environ.get('DB_PASSWORD', ''),
'HOST': os.environ.get('DB_HOST', None),
'PORT': os.environ.get('DB_PORT', None),
'CONN_MAX_AGE': 600,
}
}
使用 Django,您可以更改您的数据库技术,以便您可以在您的开发机器上使用 sqlite3(这应该是提交到源代码控制系统的合理默认设置)。虽然这是可能的,但不建议这样做:
后备服务(例如应用的数据库、排队系统或缓存)是开发/产品奇偶校验很重要的一个领域。 (The Twelve-Factor App - Dev/prod parity)