Dotcloud:运行manage.py后台服务

时间:2012-11-01 09:23:22

标签: django-orm dotcloud

我有一个Django应用程序,需要访问受API密钥限制的Web API。为了管理对API的请求,我创建了一个简单的后台服务器来轮询我的Django ORM以获取排队的任务请求,并相对于我的应用服务器异步执行它们(应用服务器不需要阻止结果)。使用自定义manage.py命令启动工作服务器。这些外部查找的处理要求非常小,所以我想直接从我的主Web服务运行它们。我已经使用临时互斥锁进行了操作,因此当我的应用程序扩展时,只会运行其中一个工作服务器。

我正在尝试找出在部署应用程序时自动启动此工作服务器的最佳方法。我尝试将它作为命令添加到我的supervisord.conf文件中,但是失败了,错误为ImportError: No module named django.core.management。我认为这是因为supervisord没有在安装Django的虚拟环境中运行。那么,我尝试从postinstall钩子运行一个单独的supervisord副本。这导致我的部署失败,因为postinstall在终止之前等待所有命令完成,并且它已超时。

有没有办法解决这些方法中的任何一种,或者可能有效的其他方法?在我看来,即使我创建了一个单独的python-worker服务,我也会遇到类似的问题。

1 个答案:

答案 0 :(得分:2)

将它放入supervisord.conf,你走在正确的轨道上。你也明白为什么你得到关于没有找到Django的错误。幸运的是,这是一个简单的解决方法。

你只需要确保用正确的python二进制文件(virtualenv中的一个)调用你的django manage.py,它应该可以正常工作。

以下是使用完全限定路径的示例,以确保我们使用正确的文件。除非您的应用也称为myapp,否则您的manage.py路径很可能会有所不同,您需要将my_awesome_command更改为自定义命令的名称。

[program:custom_command]
directory = /home/dotcloud/current/
command = /home/dotcloud/env/bin/python /home/dotcloud/current/myapp/manage.py my_awesome_command
stderr_logfile = /var/log/supervisor/%(program_name)s_error.log
stdout_logfile = /var/log/supervisor/%(program_name)s.log