我正在为网站建立投票机制。与Stackoverflow上看到的类似。
例如,如果用户点击向上箭头vote = True
。如果他再次点击它,vote = None
。该应用程序工作正常,除非我们非常快速地提交投票。
我们尝试非常快速地点击箭头,并通过记录数据来查看投票是如何发生的。不幸的是,我们看到了一些不端行为。快速,我的意思是,连续点击箭头而不停留几秒钟!
预期的日志数据应该像
vote=True
vote=None
vote=True
vote=None
..
但我观察它就像
vote=True
vote=True
vote=None
vote=None
作为第二种情况提到的观察到的日志数据似乎有点无序。 这可能意味着django收到的请求不会作为队列处理!在我们的情况下,这有点危险。或者数据库需要一些时间来存储,在此期间会处理另一个导致错误的请求。
我希望你理解我的问题。所以,我想知道你是否可以让我知道这里发生了什么,以及如何控制它。
答案 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的响应出现并且用户再次点击之前,此请求也将被视为投票,这不是您所期望的。
如果您尝试对自己的帖子进行投票,可以在SO中看到这种情况。它首先更改为vote-none模式,然后当从服务器收到响应时,它会更改回来并发出错误消息。
PS:我曾尝试将自己的帖子投票用于教育目的;)