2

我想开发一个使用 Django 作为 Fronted 和 Celery 来做背景工作的应用程序。现在,有时不同机器上的 Celery 工作人员需要访问我的 django 前端机器(两台不同的服务器)的数据库。他们需要知道一些实时的东西并运行 django-app

python manage.py celeryd 

他们需要访问包含所有可用模型的数据库。

我必须通过直接连接访问我的 MySQL 数据库吗?因此,我必须允许用户“my-django-app”不仅从我的前端机器上的本地主机访问,而且从我的其他工作服务器 ips 访问?

这是“正确”的方式,还是我错过了什么?只是认为它不是真的安全(没有 ssl),但也许这就是它必须的方式。

感谢您的回复!

4

1 回答 1

1

他们将需要访问数据库。该访问将通过数据库后端进行,该后端可以是 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 的数据库访问设置。

于 2010-10-07T18:09:22.307 回答