在不使用帐户的情况下设计Django投票系统

时间:2011-02-17 22:14:22

标签: python django django-forms django-authentication voting

我们正在考虑实施投票系统(向上,向下投票),而不使用任何类型的凭证 - 没有应用帐户,也没有OpenID或任何类似的。

关注顺序:

  1. 防止机器人投票
  2. 允许NAT下的个人投票而不会压倒/使其他人的投票无效
  3. 防止(或者至少使用户非常困难)用户多次投票
  4. 我的问题:

    1. 如果你已经实现了类似的东西,任何提示?
    2. 也许我忽视了任何疑虑?
    3. 我应该研究哪些工具?
    4. 如果您有任何问题可以帮助您形成对这些问题的答案,请在评论中提问!

2 个答案:

答案 0 :(得分:4)

解决您的疑虑:

1:一个简单的Captcha可能会成功,如果你谷歌“django验证码”,有一堆插件。我自己从未使用过它们,所以我不能说哪个是最好的。

2& 3:使用Django的会话解决了这两个问题 - 用它可以在用户的​​浏览器上保存一个cookie,表明该人已经投票。这显然允许人们通过不同的浏览器或清除他们的缓存进行投票,因此这取决于不允许人们投票两次的重要性。我想可能只有一小部分人会考虑尝试清除缓存。据我所知,在没有登录过程的情况下限制用户的唯一方法是测试IP地址,但这会违反您的第二个标准,因为同一网络上的人将显示为具有相同的IP地址。

如果你不希望多个投票就像删除浏览器cookie一样简单,你也可以允许facebook或twitter登录 - django-socialregistration插件有很好的文档和直接实现。

希望有所帮助!

答案 1 :(得分:0)

Recaptcha是一个很好的选择。对于Django来说,这是我最成功的一个,它实际上使用从Recaptcha加载的图像(而不是在运行中生成的本地图像):

http://pypi.python.org/pypi/recaptcha-client#downloads

安装说明在此代码段中:

http://djangosnippets.org/snippets/433/

如果Recaptcha对你正在做的事情有点笨拙,我听说有人实现了一个表单加载了一个隐藏的输入,其中包含一个时间戳值,对应于加载表单的时间。然后,在提交表单时,生成一个新的时间戳并获取两者之间的差异。如果以秒为单位的差异低于某个人类访问者不合理的阈值,那么您可能有机器人。这适用于具有多个字段的联系表单...通常需要一个人超过10秒才能填写它们。

我无法谈论这种技术在生产中的实际效果......现在很多这些垃圾邮件机器人都比我聪明。但它可能是你考虑调查或测试的东西。

相关问题