我想开发一个使用Django作为Fronted和Celery来做背景的应用程序。 现在,有时不同机器上的Celery工作人员需要数据库访问我的django前端机器(两个不同的服务器)。 他们需要了解一些实时内容并使用
运行django-apppython manage.py celeryd
他们需要访问所有可用模型的数据库。
我是否必须通过直接连接访问我的MySQL数据库?因此,我不得不允许用户“my-django-app”访问我的前端机器上的localhost,而不是我的其他工作服务器ips?
这是“正确”的方式,还是我错过了什么?只是觉得它不是真的安全(没有ssl),但也许这就是它必须的方式。
感谢您的回复!
答案 0 :(得分:1)
他们需要访问数据库。该访问将通过数据库后端进行,后端可以是随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',
# ...
}
}
毋庸置疑,您需要确保除了数据库管理员和Django本身之外的任何用户都无法访问DB_CONFIG
中的文件。默认情况下应该将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和LOCK TABLES。 (migrate
命令来自South。)这给了我一些保护,免受Django代码在运行时弄乱我的模式,并且它限制了SQL注入攻击可能造成的破坏(尽管你仍然应该检查和过滤所有用户输入)。
这不是解决您确切问题的方法,但它可能会为您提供一些方法来为您的目的智能化Django的数据库访问设置。