【问题标题】:how to prevent multiple votes from a single user如何防止来自单个用户的多票
【发布时间】:2012-07-19 16:53:31
【问题描述】:

我正在使用 python 在谷歌应用引擎上编写一个网络应用程序。我使用 jinja2 作为模板引擎。

我目前已对其进行了设置,以便用户可以对帖子投赞成票和反对票,但现在他们可以随意投票多次。我只是将投票记录保存在数据库中,然后立即计算。如何有效地防止用户投多票?

【问题讨论】:

  • 你能告诉我们你到目前为止做了什么吗?
  • 好吧,如果他们已经投票,第一步是禁用该按钮。下一步将是添加服务器端逻辑以提防它。
  • @Conner 我实际上不在我的开发机器上,但我可以在今天下午提交我当前的代码

标签: python google-app-engine jinja2 voting-system


【解决方案1】:

我建议创建一个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() 方法中,尤其是当您要对用户或被投票的项目执行其他操作时。

希望这会有所帮助。

【讨论】:

  • “快速”和“计数”是相反的。
  • GAE 数据存储查询在线性时间内发生,并且“count()”函数“比实际检索所有结果更快”。但是,是的,为了快速计算投票数,OP 可以增加/减少项目上的“voteCount”,然后在需要快速 voteCount 时检索该项目——增加/减少操作是属于我在回答中提到的交易。
【解决方案2】:

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

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

【讨论】:

  • 我最初认为一个简单的 if 语句会起作用,但如果我有 10,000 票怎么办? (显然还没有)检查用户的所有选票会不会有点低效?或者这不像我想的那么昂贵
  • @clifgray 您应该使用数据库的查询功能来有效地执行此操作。
  • 啊好吧,这更有意义。谢谢,应该很容易实现。
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2012-01-10
相关资源
最近更新 更多