他们需要访问数据库。该访问将通过数据库后端进行,该后端可以是 Django 或 one from a third party 附带的。
我在 Django 站点的 settings.py 中完成的一件事是从 /etc 中的文件加载数据库访问信息。这样,每台机器的访问设置(数据库主机、端口、用户名、密码)可能不同,并且密码等敏感信息不在我的项目存储库中。您可能希望以类似的方式限制对工作人员的访问,方法是让他们使用不同的用户名进行连接。
您还可以通过环境变量传入数据库连接信息,甚至只是配置文件的键或路径,并在settings.py 中处理。
例如,这是我拉入数据库配置文件的方式:
g = {}
dbSetup = {}
execfile(os.environ['DB_CONFIG'], g, dbSetup)
if 'databases' in dbSetup:
DATABASES = dbSetup['databases']
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
# ...
}
}
不用说,您需要确保DB_CONFIG 中的文件除了数据库管理员和 Django 本身之外的任何用户都无法访问。默认情况下应该将 Django 引用到开发人员自己的测试数据库。使用ast 模块代替execfile 可能还有更好的解决方案,但我还没有研究过。
我做的另一件事是使用单独的用户执行数据库管理任务而不是其他所有任务。在我的manage.py 中,我添加了以下序言:
# Find a database configuration, if there is one, and set it in the environment.
adminDBConfFile = '/etc/django/db_admin.py'
dbConfFile = '/etc/django/db_regular.py'
import sys
import os
def goodFile(path):
return os.path.isfile(path) and os.access(path, os.R_OK)
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"] \
and goodFile(adminDBConfFile):
os.environ['DB_CONFIG'] = adminDBConfFile
elif goodFile(dbConfFile):
os.environ['DB_CONFIG'] = dbConfFile
/etc/django/db_regular.py 中的配置适用于只能通过 SELECT、INSERT、UPDATE 和 DELETE 访问 Django 数据库的用户,而/etc/django/db_admin.py 用于具有这些权限以及 CREATE、DROP、INDEX、ALTER 的用户和锁定表。 (migrate 命令来自South。)这为我提供了一些保护,避免 Django 代码在运行时弄乱我的模式,并且限制了 SQL 注入攻击可能造成的损害(尽管您仍然应该检查和过滤所有用户输入)。
这不是解决您的确切问题的方法,但它可能会为您提供一些想法,让您了解如何根据您的目的智能化 Django 的数据库访问设置。