Google App Engine 中的 VoteHandler

发布于 2024-09-16 22:50:07 字数 1903 浏览 4 评论 0原文

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

class 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('/', { })

对于模型:

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

website = db.StringProperty()

text = db.StringProperty ()

created = db.DateTimeProperty(auto_now=True)

votes = db.IntegerProperty(default=1)

class Vote(db.Model):

user = db.ReferenceProperty(User) #查看是否投票此站点尚未

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

upvote = db.IntegerProperty(default=1)

创建 = db.DateTimeProperty(auto_now=True)

I am trying to have this function limit a user to only one vote per image. However it currently lets all votes through. If I change "if existing_vote != 0:" to "if existing_vote == 0:" it lets no votes through. Thoughts?

class 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('/', { })

For the Models:

class User(db.Model):

account = db.StringProperty()

password = db.StringProperty()

name = db.StringProperty()

created = db.DateTimeProperty(auto_now=True)

class Image(db.Model):

user = db.ReferenceProperty(User)

photo_key = db.BlobProperty()

website = db.StringProperty()

text = db.StringProperty()

created = db.DateTimeProperty(auto_now=True)

votes = db.IntegerProperty(default=1)

class Vote(db.Model):

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

photo = db.ReferenceProperty(Image) #To apply vote to right URL

upvote = db.IntegerProperty(default=1)

created = db.DateTimeProperty(auto_now=True)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

兮子 2024-09-23 22:50:07

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

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

为,例如,

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

那么比较就变成了字符串之间的简单相等性检查,并且肯定可以在没有任何复杂性的情况下工作——如果可行的话,简单性通常是更好的选择。

Looks like your filter on user is wiping out every existing vote, i.e., the equality there is never satisfied. And indeed I'm not sure how I'd satistfy an equality check on a reference propertly. Why not change

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

to, e.g.,

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

Then the comparison becomes a simple equality check between strings and is sure to work without any complication -- simplicity is generally preferable, when feasible.

绝影如岚 2024-09-23 22:50:07

在此行中:

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

您需要在过滤器中的“photo”和“=”之间放置一个空格 - 否则,它会尝试过滤名为“photo=”的属性。这应该有效:

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

On this line here:

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

You need to put a space between the 'photo' and the '=' in the filters - otherwise, it's attempting to filter for a property called 'photo='. This should work:

existing_vote = models.Vote.all().filter('user =', self.Session['userkey']).filter('photo =',vurl).count()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文