【问题标题】:Django Celery Database for Models on Producer and Worker生产者和工人模型的 Django Celery 数据库
【发布时间】:2011-04-22 12:07:58
【问题描述】:

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

运行 django-app
python manage.py celeryd 

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

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

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

感谢您的回复!

【问题讨论】:

    标签: django celery


    【解决方案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',
                # ...
            }
        }
    

    不用说,您需要确保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 的数据库访问设置。

    【讨论】:

    • 谢谢!我认为这是确保我的数据库登录在正确的人手中的好方法。
    • 您可能还想以类似的方式将您的SECRET_KEY 设置存储在settings.py 文件之外。
    猜你喜欢
    • 2011-07-24
    • 2017-07-02
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2012-07-01
    • 2017-02-25
    相关资源
    最近更新 更多