2010-09-01 65 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