3

我有一个 Django 函数,它拍摄应用程序提供的页面之一的快照。它通过从应用程序打开到应用程序的 HTTP 连接来实现此目的。

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

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

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

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

我想过使用信号处理程序,但是信号处理程序在模型的方法model期间都同步执行,并且信号不包含视图中更改的模型。saverequest_finished

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

音量将非常低,因为它是通过管理界面完成的。不过,我无法连接到管理界面,因为这也将在请求/响应期间执行。

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

4

2 回答 2

2

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

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

如果您碰巧使用的是 upstart,我在这里发布了一个 upstart 脚本的示例来自动启动您的 django-celery 代理。

于 2012-08-21T12:28:25.873 回答
0

我不知道您是否可以接受,但一种简单的方法是将其编写为脚本并从 django 应用程序在后台运行。

于 2012-08-21T12:40:34.887 回答