2012-07-19 50 views
1

我正在用python在谷歌应用程序引擎上编写一个web应用程序。我使用jinja2作为模板引擎。如何防止来自单个用户的多个选票

我现在已经设置好了,以便用户可以upvote和downvote帖子,但现在他们可以多次投票他们想要的。我只是在数据库中有投票记录,然后在那之后进行计算。我如何有效防止用户投多张选票?

+0

你能告诉我们你到目前为止做了什么吗? – Conner 2012-07-19 16:54:42

+0

好吧,如果他们已经投票了,第一步就是关闭按钮。下一步将是添加服务器端逻辑来注意它。 – voithos 2012-07-19 16:56:43

+0

@Conner我实际上并不在我的开发机器上,但今天下午我可以放置当前的代码 – clifgray 2012-07-19 17:09:58

回答

1

存储投票用户的投票,并使用您的数据库检查当前用户的现有投票,

您可以在提供页面(以及禁用投票按钮)之前或者当您获得投票尝试(并显示某种类型的消息)时执行检查。如果投票真的对你很重要,你应该编写代码来处理这两种情况。

+0

我最初以为一个简单的if语句可以工作,但如果我有10,000票? (显然还不存在),检查用户的所有投票是不是有点低效?或者不是CPU的昂贵,因为我在想 – clifgray 2012-07-19 17:09:27

+0

@clifgray您应该使用数据库的查询功能来有效地完成这项工作。 – Marcin 2012-07-19 17:11:27

+0

啊没关系,这更有意义。谢谢,应该很简单,实施。 – clifgray 2012-07-19 17:12:58

2

我建议制作一个toggleVote方法,它接受要切换投票的项目的关键字和进行投票的用户的密钥。

我还建议增加一个表来记录选票,基本上包含两个领域:

"keyOfUserVoting", "keyOfItemBeingVotedOn" 

这样,你可以简单地做一个非常查询,其中键匹配,如果一个项目存在,那么,你知道用户对该项目投了赞成票。 (Query where keyOfUserVoting = 'param1' and keyOfItemVoted='param2'if result != None,那么就意味着用户投票)

对于toggleVote()方法的情况下,可以很简单:

toggleVote(keyOfUserVoting, keyOfItemToVoteOn): 
    if (queryResultExists): 
     // delete this record from the 'votes' table 
    else: 
     // add record to the 'votes' table 

这样,你永远不用担心跟踪的上基于用户投了多少次的个人基础。

也是这样,如果你想找出一个物品上有多少票,你可以做另一个查询来快速。再次,与GAE,这将是非常快。

在此设置中,你也可以很快告诉多少次用户投票中的一个项目(count where userKey = value and where itemKey = value),或多少次用户投票在整个系统(count where userKey = value)...

最后,为了获得最佳可靠性,您可以将更新包装在交易中的toggleVote()方法中,尤其是在您要对用户或正在投票的项目执行其他操作时。

希望这会有所帮助。

+0

“快”和“数”是相反的。 – 2012-07-20 06:29:24

+0

GAE数据存储查询发生在线性时间,'count()'函数“以比实际检索所有结果更快的一个常数因子”。然而,是的,为了快速获得选票数量,OP可以增加/减少物品上的'voteCount',然后在需要快速投票的时候检索'voteCount' - 增加/减少操作是什么的一部分属于我在答案中提到的交易。 – Cuga 2012-07-20 17:57:36