django:保存后立即填充对象的额外信息

时间:2012-02-18 14:27:28

标签: django django-models django-views

我在django中有一个web服务,我需要尽可能快地提供请求。 每个请求都更新一个对象。我还保存请求IP地址以便稍后填充地理信息。

获取地理信息由外部服务提供商完成。我给他们ip地址并获取地理信息。

所以我希望尽可能快地提供用户请求,并在创建/更新后立即填充地理信息。 (1-2秒后)

所以我需要一个处理程序,在响应请求后称为1-2秒。它应该有更新或创建的对象作为参数。

我想这不是post_save,但我找不到正确的方法。

实现这一目标的最佳方式是什么? 感谢

2 个答案:

答案 0 :(得分:2)

因此,任务是将工作移出请求 - 响应周期。你是正确的,django的信号与此无关。您可以尝试celery来完成任务,它似乎是最成熟和最广泛使用的方法,可以将工作移出django的请求 - 响应周期。

答案 1 :(得分:1)

就像米哈伊尔在他的回答中所说,像Celery这样的任务队列绝对是一个很好的方法。

如果出于某种原因,您不希望将IP存储到单独的任务,因为您无法确定异步任务是否已及时完成,您至少可以加快存储速度通过将其保存在快速键值存储或NoSQL DB中来获取该信息。

Redis可能非常适合。在模型的save()中添加一个调用,该调用将IP值置于Redis中,并使用一个键作为调用save()的模型实例的唯一标识符,然后添加一个方法(或属性 - 装饰方法)称为stored_ip或任何知道如何在需要将其发送给您的地理伙伴时从Redis撤回IP的方法。完成地理位置后,从Redis中清除密钥,这样Redis就不会耗尽内存。

以这种方式保存IP应该是快速的,不需要对当前代码进行太多更改。