2010-10-07 117 views
2

我想开发一个应用程序,使用Django作为前端和芹菜做背景的东西。 现在,有时不同机器上的Celery工作人员需要通过数据库访问我的django前端机器(两台不同的服务器)。 他们需要知道一些实时的东西,并与Django芹菜生产者和工人模型数据库

python manage.py celeryd 

他们需要提供所有型号访问数据库运行Django的应用程序。

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

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

感谢您的回复!

回答

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的配置是与只访问Django的数据库与SELECT,INSERT,UPDATE用户和DELETE和/etc/django/db_admin.py是与用户这些权限加上CREATE,DROP,INDEX,ALTER和LOCK TABLES。 (该migrate命令是从South)。这使我从Django的代码我在运行时模式搞乱了一些保护,并限制了损坏的SQL注入攻击可能会导致(虽然你还是应该检查并过滤所有用户输入)。

这不是一个解决你的确切问题,但它可能会给你一些想法,以便为你的目的来加快Django的数据库访问设置。

+0

谢谢!我认为这是确保我的数据库登录处于最佳状态的好方法。 – dotmoo 2010-10-07 19:05:22

+0

您可能也想以类似的方式将“SECRET_KEY”设置存储在'settings.py'文件之外。 – 2010-10-07 20:38:51