【问题标题】:VoteHandler in Google App EngineGoogle App Engine 中的投票处理程序
【发布时间】:2010-09-01 21:13:42
【问题描述】:

我试图让这个功能限制用户每张图片只能投一票。但是,它目前允许所有投票通过。如果我将“if existing_vote != 0:”更改为“if existing_vote == 0:”,它不会让任何投票通过。想法?

类 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):

account = db.StringProperty()

密码 = db.StringProperty()

name = db.StringProperty()

创建 = db.DateTimeProperty(auto_now=True)

类图像(db.Model):

user = db.ReferenceProperty(User)

photo_key = db.BlobProperty()

网站 = db.StringProperty()

文本 = db.StringProperty()

创建 = db.DateTimeProperty(auto_now=True)

投票 = db.IntegerProperty(default=1)

班级投票(db.Model):

user = db.ReferenceProperty(User) #查看是否在本站投票

photo = db.ReferenceProperty(Image) #对正确的 URL 进行投票

upvote = db.IntegerProperty(default=1)

创建 = db.DateTimeProperty(auto_now=True)

【问题讨论】:

  • 计数等于多少?添加一个日志语句并尝试找出它实际返回的内容:existing_vote = models.Vote.all().filter('user=', self.Session['userkey']).filter('photo=',vurl ).count() 更好的实现是在实体组中创建一个投票类作为用户的子对象,其中 photoId 作为键。题外话,但你介意我问你为什么实现自己的用户类而不是使用 Google 帐户或 OpenID?
  • 1.日志显示existing_vote = 0 2. n00b 在这里,并且正在一本创建用户类的书中关闭教程......

标签: python google-app-engine function vote


【解决方案1】:

看起来您对用户的过滤器正在清除所有现有投票,即永远不会满足平等。事实上,我不确定如何正确地满足对 reference 的平等检查。为什么不改变

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

到,例如,

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

然后,比较就变成了字符串之间的简单相等性检查,并且确保工作没有任何复杂性——在可行的情况下,简单性通常是可取的。

【讨论】:

  • 不应该使用分片计数器吗?我错过了什么吗?
  • @Matt,一个只计数到 0 或 1 并且由每对用户和图像键入的分片计数器...?对我来说似乎很奇怪 - 小心发布一个澄清的答案,因为我无法理解评论和 cmets 太有限,你无法充分扩展它,我担心。
  • @Matt @Alex - 感谢您的回答。这是我昨晚的工作:gist.github.com/562252。而且我不熟悉分片计数器,现在检查一下
【解决方案2】:

在此行:

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()

【讨论】:

  • 这绝对是其中的一部分。令人惊讶的是,空间是问题的一部分
  • 这绝对是一个陷阱,但我们无法在不破坏现有应用程序的情况下更改它。一旦你意识到 'foo=' 是一个有效的属性名,它就有意义了。您可以继续使用引用属性,尽管 - 都是对引用属性的有效操作。
猜你喜欢
  • 2011-03-21
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2020-03-19
  • 2015-05-29
  • 1970-01-01
  • 2012-11-13
相关资源
最近更新 更多