Django是否将请求作为队列处理?

时间:2013-09-17 12:38:26

标签: django django-models queue

我正在为网站建立投票机制。与Stackoverflow上看到的类似。

例如,如果用户点击向上箭头vote = True。如果他再次点击它,vote = None。该应用程序工作正常,除非我们非常快速地提交投票。

我们尝试非常快速地点击箭头,并通过记录数据来查看投票是如何发生的。不幸的是,我们看到了一些不端行为。快速,我的意思是,连续点击箭头而不停留几秒钟!

预期的日志数据应该像

vote=True
vote=None
vote=True
vote=None
..

但我观察它就像

vote=True
vote=True
vote=None
vote=None

作为第二种情况提到的观察到的日志数据似乎有点无序。 这可能意味着django收到的请求不会作为队列处理!在我们的情况下,这有点危险。或者数据库需要一些时间来存储,在此期间会处理另一个导致错误的请求。

我希望你理解我的问题。所以,我想知道你是否可以让我知道这里发生了什么,以及如何控制它。

2 个答案:

答案 0 :(得分:1)

您无法假设浏览器发送(异步)请求的顺序,它们到达服务器的顺序以及单个或多个实例(线程,工作者)Django处理它们的顺序应用

所以你上面描述的是你真正想要的。执行同步请求可能会有所帮助。在允许进一步点击之前,最好的选择可能是(异步)等待服务器的响应。

答案 1 :(得分:0)

您必须拥有类似于此的流程:

-> User clicks button
-> check if user has already voted up
-> if no:
    -> vote up request goes
    -> vote up after validation
    -> response is sent back to browser
-> else:
    -> vote none request goes
    -> remove the vote after validation
    -> response is sent back to browser

如果您在请求已经发送并且等待其响应时没有禁用该按钮,那么您将陷入这种情况。

说,request1被认为已经投票并且已发送请求。

在request1的响应出现并且用户再次点击之前,此请求也将被视为投票,这不是您所期望的。

  • 您应该在进行ajax调用之前禁用该按钮,并在收到响应时再次启用它。
  • 或者每当用户点击时,即使在进行ajax调用之前,您也应该翻转按钮类型,即对投票请求进行投票 - 无投票请求,反之亦然。收到ajax响应后,再次验证之前的操作。它只会在服务器端验证失败的情况下发生变化,例如用户可能没有投票权。

如果您尝试对自己的帖子进行投票,可以在SO中看到这种情况。它首先更改为vote-none模式,然后当从服务器收到响应时,它会更改回来并发出错误消息。

PS:我曾尝试将自己的帖子投票用于教育目的;)