Django:在继续下一个请求之前完成处理来自用户的一个请求

时间:2014-07-14 16:54:46

标签: python django rabbitmq celery

我目前正在寻找一种可以防止用户同时发出多个请求的解决方案。我希望在我处理用户的第二个请求之前完成第一个请求。例如,假设用户adam喜欢和不喜欢suzy的照片。对照片的不喜欢和喜欢都发生在同一视图中。

目前我遇到的问题是我正在同时处理这两个请求。在类似视图的情况下,当用户喜欢某事时,我创建了一个like_object。当用户决定不同的东西时,我检查数据库中是否存在like_object,然后将其删除。然而!如果第一个请求尚未完成,则第二个请求中对like_object的检查将返回,表示没有相似的对象,它将创建第二个like_object。

一旦完成所有这些处理,我将最终为来自同一用户的同一张照片提供2个like_object。这很糟糕。

为了向您提供更多信息,我使用Gunicorn作为我的HTTP服务器。我运行3个普通工人,这就是为什么每个请求同时处理的原因。

那么您认为我能做什么?我的意思是,我正在考虑使用Celery和RabbitMQ。每个请求都将提交到队列中并异步处理。这是一个选择。但我觉得在这种情况下这可能有点矫枉过正。我正在寻找可以在Django中直接完成的事情。嗯,让我知道可能的解决方案。

谢谢

2 个答案:

答案 0 :(得分:0)

更好的方法是将一个True或False而不是一个toggle对象发送到django应用程序。另外,使用jquery在客户端实现它,让jquery向django app发送异步请求来设置/取消设置。

所以,像......

http://example.org/posts/1/like

http://example.org/posts/1/unlike

在浏览器上切换一个javascript变量,指示是否已经喜欢某些内容。然后将一个布尔值true或false发送到django应用程序。

答案 1 :(得分:0)

我不知道为什么我没有更快地想到这一点,我在unique_together子句中添加了一个将阻止创建另一个like_object的内容。