我正在用python在谷歌应用程序引擎上编写一个web应用程序。我使用jinja2作为模板引擎。如何防止来自单个用户的多个选票
我现在已经设置好了,以便用户可以upvote和downvote帖子,但现在他们可以多次投票他们想要的。我只是在数据库中有投票记录,然后在那之后进行计算。我如何有效防止用户投多张选票?
我正在用python在谷歌应用程序引擎上编写一个web应用程序。我使用jinja2作为模板引擎。如何防止来自单个用户的多个选票
我现在已经设置好了,以便用户可以upvote和downvote帖子,但现在他们可以多次投票他们想要的。我只是在数据库中有投票记录,然后在那之后进行计算。我如何有效防止用户投多张选票?
存储投票用户的投票,并使用您的数据库检查当前用户的现有投票,。
您可以在提供页面(以及禁用投票按钮)之前或者当您获得投票尝试(并显示某种类型的消息)时执行检查。如果投票真的对你很重要,你应该编写代码来处理这两种情况。
我建议制作一个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()
方法中,尤其是在您要对用户或正在投票的项目执行其他操作时。
希望这会有所帮助。
“快”和“数”是相反的。 – 2012-07-20 06:29:24
GAE数据存储查询发生在线性时间,'count()'函数“以比实际检索所有结果更快的一个常数因子”。然而,是的,为了快速获得选票数量,OP可以增加/减少物品上的'voteCount',然后在需要快速投票的时候检索'voteCount' - 增加/减少操作是什么的一部分属于我在答案中提到的交易。 – Cuga 2012-07-20 17:57:36
你能告诉我们你到目前为止做了什么吗? – Conner 2012-07-19 16:54:42
好吧,如果他们已经投票了,第一步就是关闭按钮。下一步将是添加服务器端逻辑来注意它。 – voithos 2012-07-19 16:56:43
@Conner我实际上并不在我的开发机器上,但今天下午我可以放置当前的代码 – clifgray 2012-07-19 17:09:58