设计一个不使用账户的Django投票系统

6 投票
2 回答
1301 浏览
提问于 2025-04-16 12:02

我们正在考虑建立一个投票系统(可以投赞成票和反对票),而且不想使用任何类型的身份验证,比如应用账户、OpenID之类的东西。

我们关注的主要问题有:

  1. 防止机器人投票
  2. 允许在同一个NAT(网络地址转换)下的个人投票,而不影响其他人的投票
  3. 防止用户重复投票(或者至少让这件事变得非常困难)

我有几个问题:

  1. 如果你实现过类似的系统,有什么建议吗?
  2. 有没有我可能忽视的担忧?
  3. 有没有什么工具是我应该了解的?

如果你有任何问题,可以帮助你更好地回答这些问题,请在评论中提问!

2 个回答

0

Recaptcha是个不错的选择。对于Django,我用过的最成功的一个是,它实际上使用的是从Recaptcha加载的图片(而不是本地生成的图片):

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

安装的说明在这个链接里:

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

如果Recaptcha对你的需求来说有点复杂,我听说有些人实现了一种表单,表单加载时会有一个隐藏的输入框,里面包含一个时间戳,表示表单加载的时间。然后,当表单提交时,生成一个新的时间戳,计算两个时间戳之间的差值。如果这个差值的秒数低于某个对人类访客来说不合理的阈值,那很可能你遇到了机器人。这种方法适用于有多个字段的联系表单……通常人填写这些表单需要超过10秒钟。

我不能说这种方法在实际使用中有多有效……现在很多垃圾邮件机器人都比我聪明。不过,你可以考虑看看或者测试一下。

4

关于你的问题,简单说一下:

1: 如果你想防止机器人投票,简单的验证码可能就能解决这个问题。你可以在网上搜索“django captcha”,会找到很多相关的插件。我自己没用过,所以不太清楚哪个最好。

2和3: 使用Django的会话功能可以解决这两个问题。通过这个功能,你可以在用户的浏览器上保存一个小文件(叫做cookie),用来标记这个人已经投过票了。不过,这样做的话,用户可以通过换浏览器或者清除缓存来再次投票,所以这就看你有多在意不让人重复投票了。我觉得其实只有一小部分人会想到清除缓存来投票。至于不让用户重复投票的另一种方法,就是检测IP地址,但这样会有问题,因为同一个网络下的人会有相同的IP地址,这样就不符合你的第二个要求。

如果你不想让重复投票变得那么简单,比如只需删除浏览器的cookie,你还可以考虑让用户通过Facebook或Twitter登录。django-socialregistration这个插件文档写得很清楚,使用起来也比较简单。

希望这些信息对你有帮助!

撰写回答