让Django触发请求回到自身的最简单方法是什么?

时间:2012-08-21 12:16:08

标签: django

我有一个Django函数,可以获取应用程序提供的其中一个页面的快照。它通过从应用程序打开与应用程序的HTTP连接来实现此目的。

目前这是一个管理命令,它运行正常。我想在保存模型时触发此操作,但是,因为我正在快照与模型连接的数据。如果我从模型的save方法触发函数,那么我会遇到视图代码在请求 - 响应Django循环中部分触发请求的情况,并且urllib2会抱怨。

我想这可能是因为我的django dev服务器上只有一个线程。即使这是原因,我也不希望我的应用依赖于在模型保存期间有两个线程可用。我不想将我的代码耦合到服务器的线程。

我认为我需要异步执行此操作,以便在保存模型并且请求/响应周期结束时,某些代理会启动并说“您需要运行此功能”。

可能的解决方案包括创建一个线程(我认为这不是一个特别好的主意)或使用Celery(可能因为我只做少量的工作而过度杀死)。

我想过使用信号处理程序,但model信号处理程序都在模型的save方法中同步执行,request_finished信号不包含已更改的模型观点。

我可以使用运行管理命令的cron作业,但这会引入其他复杂性。如果之前的工作尚未完成怎么办?如何表明存储该信号量以及在什么上下文中存储?

音量非常低,因为它是通过管理界面完成的。我不能挂钩到管理界面,因为这也会在请求/响应期间执行。

假设我的问题是我需要异步触发此函数,最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

我肯定会推荐芹菜 - 真的没有更好的选择。将django-celerydjango database broker一起使用非常轻量级,并且不需要设置任何AMQP服务器 - 它使用与django使用的数据库相同的数据库。

我已将此设置用于具有轻量级异步需求的多个django项目,并且非常简单可靠。

如果您碰巧使用暴发户,我发布了一个新手脚本示例,以自动启动您的django-celery经纪人here

答案 1 :(得分:0)

我不知道你是否接受它,但是一个简单的方法就是把它写成脚本并在django应用程序的后台运行它。