我正在用 python 在谷歌应用引擎上编写一个网络应用程序。我使用 jinja2 作为模板引擎。
我目前已经设置好了,这样用户就可以对帖子投赞成票和反对票,但现在他们可以随意投票多次。我只是将投票记录保存在数据库中,然后立即计算。如何有效地防止用户投多票?
我正在用 python 在谷歌应用引擎上编写一个网络应用程序。我使用 jinja2 作为模板引擎。
我目前已经设置好了,这样用户就可以对帖子投赞成票和反对票,但现在他们可以随意投票多次。我只是将投票记录保存在数据库中,然后立即计算。如何有效地防止用户投多票?
我建议制作一个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
这样,您就不必担心单独跟踪用户投票的次数。
同样这样,如果你想知道一个项目有多少票,你可以做另一个查询来快速count where keyOfItemToVoteOn = paramKeyOfItem
。同样,使用 GAE,这将非常快。
在此设置中,您还可以快速了解用户对一个项目的投票次数 ( count where userKey = value and where itemKey = value
),或者用户在整个系统中投票的次数 ( count where userKey = value
)...
最后,为了获得最佳可靠性,您可以将更新包装在toggleVote()
事务中的方法中,尤其是当您将对用户或被投票的项目执行其他操作时。
希望这可以帮助。
将投票用户与投票一起存储,并使用您的数据库检查当前用户的现有投票。
您可以在提供页面之前执行检查(因此禁用您的投票按钮),或者在您获得投票尝试时(并显示某种消息)。如果投票对您来说真的很重要,您可能应该编写代码来处理这两种情况。