他们将需要访问数据库。该访问将通过数据库后端进行,该后端可以是 Django 附带的,也可以是来自第三方的。
我在 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
除了 db 管理员和 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
其中 config in/etc/django/db_regular.py
是针对只能通过 SELECT、INSERT、UPDATE 和 DELETE 访问 Django 数据库/etc/django/db_admin.py
的用户,并且是针对具有这些权限以及 CREATE、DROP、INDEX、ALTER 和 LOCK TABLES 的用户。(migrate
命令来自South。)这为我提供了一些保护,防止 Django 代码在运行时与我的架构发生混淆,并且限制了 SQL 注入攻击可能造成的损害(尽管您仍然应该检查和过滤所有用户输入)。
这不是针对您的确切问题的解决方案,但它可能会为您提供一些想法,以便为您的目的智能化 Django 的数据库访问设置。