一次将用户限制为单个请求GAE数据存储

时间:2016-01-29 13:16:04

标签: python ajax google-app-engine request webapp2

  

问题

假设用户对某个问题(如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

1 个答案:

答案 0 :(得分:0)

当您执行get()时,您正在创建用户类的新实例,以便将isVoting设置为false并且永远不会记住他已经对该问题进行了投票。

此外,每个问题都应该有一个hasVoted指标。否则,当您处理不同的问题时,您可以将其表示为已投票。

您需要创建所有“当前用户”的列表,其中包含您希望它们保留的状态。然后,当您创建当前用户的新实例时(将投票状态设置为false),您需要检查该用户ID列表并更新状态指示器。否则,当“currrent用户”完成时,您将释放类实例,如果用户再次返回投票,则将其重置为false。

您应该在get()方法中为用户和问题执行此操作,以便您可以验证当前问题尚未被投票。在您的代码中,您应该为该问题上的已投票状态设置get()选项。

请注意,您不应直接设置类变量,而应创建将引用类中类变量的方法。