2010-09-01 64 views
2

我试图让这个功能限制用户每张图片只有一个投票。但是它目前可以让所有选票都通过。如果我将“if existing_vote!= 0:”更改为“if existing_vote == 0:”,它将不允许投票。思考?Google App Engine中的VoteHandler

类VoteHandler(webapp.RequestHandler):

def get(self): 
    #See if logged in 
    self.Session = Session() 
    if not 'userkey' in self.Session: 
     doRender(
      self, 
      'base/index.html', 
      {'error' : 'Please login to vote'}) 
     return 

    #If user hasn't voted - if user doesn't have a vote on that image object 
    key = self.request.get('photo_id') 
    vurl = models.Image.get_by_id(int(key)) 

    #pull current site vote total & add 1 

    existing_vote = models.Vote.all().filter('user=', self.Session['userkey']).filter('photo=',vurl).count() 

    if existing_vote != 0: 
     self.redirect('/', { }) 
    else:  
     newvote = models.Vote(user=self.Session['userkey'], url=vurl) 
     vurl.votes += 1 
     vurl.put() 
     logging.info('Adding a vote') 

     #Create a new Vote object 
     newvote = models.Vote(user=self.Session['userkey'], url=vurl) 
     newvote.put()  
     self.redirect('/', { }) 

对于型号:

类用户(db.Model):

帐户= db.StringProperty()

password = db.StringProperty()

名称= db.StringProperty()

创建= db.DateTimeProperty(auto_now =真)

类Image(db.Model):

用户= db.ReferenceProperty(用户)

photo_key = db.BlobProperty()

网站= db.StringProperty()

文本= db.StringProperty()

创建= db.DateTimeProperty(auto_now =真)

票= db.IntegerProperty(缺省= 1)

类投票(db.Model):

用户= db.ReferenceProperty(用户)#See如果投在这个网站还

照片= db.ReferenceProperty(图)q若要申请投票向右URL

给予好评= db.IntegerProperty(默认值= 1)

创建= db.DateTimeProperty(auto_now = TRUE)

+0

计数等于什么?添加日志记录并试图找出这实际返回的内容: existing_vote = models.Vote.all()。filter('user =',self.Session ['userkey'])。filter('photo =' ,vurl).count() 一个更好的实现是创建一个投票类作为用户在一个实体组中的用户的子对象,其中的photoId作为关键字。 偏离主题,但你介意我为什么要实现自己的用户类而不是使用Google帐户或OpenID? – 2010-09-01 23:09:59

+0

1.日志显示existing_vote = 0 2. n00b在这里,并在创建用户类的书中去教程... – Emile 2010-09-01 23:13:55

回答

1

貌似用户的过滤器被消灭每一个现有的票,即平等有从不满意。事实上,我不确定我是如何在参考文献上进行平等检查的。为什么不改变

user = db.ReferenceProperty(User) #See if voted on this site yet 

到,例如,

useraccount = db.StringProperty() # account of user who cast this vote 

然后比较变得串之间的简单相等性检查和是肯定没有任何并发​​症工作 - 简单,通常优选,当可行的。

+0

不应该使用分片计数器?我错过了什么吗? – 2010-09-02 02:04:48

+0

@Matt,一个只计数到0或1的分片计数器,并且被每一对用户和图像所控制......?对我来说似乎很奇怪 - 谨慎发表一个澄清的答案,因为我无法理解评论意见,并且评论太有限,您无法充分展开它,我担心。 – 2010-09-02 02:10:14

+0

@Matt @Alex - 感谢您的回答。这是我昨晚的工作:http://gist.github.com/562252。我不熟悉分片计数器,检查现在是 – Emile 2010-09-02 13:06:49

1

在这条线的位置:

existing_vote = models.Vote.all().filter('user=', self.Session['userkey']).filter('photo=',vurl).count() 

你需要把在过滤器上的“照片”和“=”之间的空间 - 否则,它试图筛选出一个名为属性“照片=” 。这应该工作:

existing_vote = models.Vote.all().filter('user =', self.Session['userkey']).filter('photo =',vurl).count() 
+0

,这绝对是它的一部分。令人惊讶的是,但空间是问题的一部分 – Emile 2010-09-02 13:01:37

+0

这绝对是一个问题,但我们不能改变它,没有潜在的破坏现有的应用程序。一旦你意识到'foo ='是一个有效的属性名称,这是有道理的。您可以继续使用引用属性,但 - <, = and >都是引用属性上的有效操作。 – 2010-09-02 16:10:58