问题
假设用户对某个问题(如SO)进行投票。将makeVote
ajax请求发送到服务器。当前问题(currentQ
)和用户(currentUser
)可从网址和当前会话中使用。如何防止用户一次发送多个请求并多次投票?
我的错误解决方案
Ajax请求
function voteUp(){
$.ajax({url: "servertools/py/vote?quid="+getUrlParameter('quid')+"&type=quid&a=1", success: function(result){
$("#questionVotes").html(result);
}});
Python请求处理程序(webapp2)
(我的Student
类有一个布尔属性isVoting
,默认为False
currentUser = Student.query(Student.user_id == self.session.get('dbid')).get()
currentQ = Question.query(Question.qid == self.request.get('quid')).get()
if currentUser.isVoting: # if another request is active
# write unchanged votes
return
# otherwise, no other request is active
currentUser.isVoting = True # set request to currently active. Unsafe for other requests.
currentUser.put()
# perform vote accordingly
currentUser.isVoting = False # current request complete. set request to inactive. Safe for other requests.
currentUser.put()
问题
if currentUser.isVoting:
永远不会True
答案 0 :(得分:0)
当您执行get()时,您正在创建用户类的新实例,以便将isVoting设置为false并且永远不会记住他已经对该问题进行了投票。
此外,每个问题都应该有一个hasVoted指标。否则,当您处理不同的问题时,您可以将其表示为已投票。
您需要创建所有“当前用户”的列表,其中包含您希望它们保留的状态。然后,当您创建当前用户的新实例时(将投票状态设置为false),您需要检查该用户ID列表并更新状态指示器。否则,当“currrent用户”完成时,您将释放类实例,如果用户再次返回投票,则将其重置为false。
您应该在get()方法中为用户和问题执行此操作,以便您可以验证当前问题尚未被投票。在您的代码中,您应该为该问题上的已投票状态设置get()选项。
请注意,您不应直接设置类变量,而应创建将引用类中类变量的方法。