python - 如何为我的博客中的帖子实现 'Vote up' 系统?

标签 python mysql google-app-engine jinja2

<分区>

我在谷歌应用引擎中使用 Python 写了一个简单的博客。我想为我的每个帖子实现投票系统。我的帖子存储在 SQL 数据库中,并且我有一列表示没有收到选票。有人可以帮我为个别帖子设置投票按钮吗?我使用 Jinja2 作为模板引擎。

如何确保投票安全?当有人点击投票按钮时,我正在考虑发送一个 POST/GET,我的 python 脚本将相应地读取和更新数据库。但后来我意识到这是不安全的。欢迎提出所有建议。

最佳答案

首先,请记住没有所谓的“安全”,只有“对 X 足够安全”。总要权衡取舍 — 更安全意味着您的合法用户更烦人,而您的成本更高。

抛开这些泛泛而谈,考虑您的具体情况。没有什么与用户具有一对一的关系。 IP地址或计算机往往由多人共享,同时,人们往往拥有多个地址或计算机。有时,这样的事情“足够好”,但从您的问题来看,这听起来并不像。

但是,对于用户帐户,唯一的误报来自于人们故意创建多个帐户或入侵他人的帐户,并且没有误报。从“请不要创建 socks 木偶”到验证码,再到信用卡检查,再到信任/声誉评分网络,再到询问现实生活信息,烦恼/成本与安全权衡之间存在一条漂亮的线性曲线并聘请一名调查员进行检查。

在现实生活中, 往往不止这两件事。例如,如果您愿意接受更多作弊,如果这直接意味着您可以赚更多钱,那么您可以向人们收取真钱来投票(就像许多电视节目使用的 1-900 行一样)。


How do Reddit and Digg check multiple voting from a single registered user?

我不太清楚 Reddit 或 Digg 是如何做事的,但总体思路很简单:跟踪个人投票。

通常,您会将用户存储在某种 SQL RDBMS 中。因此,您只需添加一个包含用户 ID、问题 ID 和答案列的 Votes 表。 (如果您正在使用某种 NoSQL 解决方案,它应该很容易进行适当的翻译。例如,也许每个问题都有一个文档,并且该文档是一个将用户 ID 映射到答案的字典。)当用户投票时,只需INSERT 一行到数据库中。

将投票界面放在一起时,无论是通过服务器端模板还是客户端 AJAX,调用一个检查现有投票的函数。如果有,则不显示投票控件,而是显示“您已经投赞成票”的某种表示形式。您还想在投票记录时再次检查,以确保没有人通过打开 200 个页面副本来破解系统,所有这些副本都允许投票(因为用户尚未投票),然后提交 200是的投票,但是对于 SQL 数据库,这就像将 Question, User 变成一个多列唯一键一样简单。

如果您想允许更改或撤消投票,只需向界面添加更多控件,并使用 UPDATEDELETE 调用来处理它们。如果你真的想变得很花哨——比如这个网站,如果你有足够的代表并且如果你的原始投票是在过去 5 分钟内或者答案在你投票后已经被编辑(或类似的东西)——你可以必须保留一些额外的信息,例如为每个投票操作记录一行,并带有时间戳,而不是为每个用户只记录一个答案。

这种设计还意味着,不是在某处保留计数,而是通过例如 SELECT COUNT(*) FROM Votes WHERE Question=?按答案分组。但是,像往常一样,如果这太慢了,您始终可以通过非规范化进行优化,并保持总计与实际投票数一致。同样,如果您的用户群很大,您可能希望存档对旧问题的投票并将它们从操作数据库中取出。等等。

关于python - 如何为我的博客中的帖子实现 'Vote up' 系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14347244/

相关文章:

python - 用 pyparsing 编写递归解析器

python - 使用python requests模块获取验证码图像的问题

python - 战舰: How to automate instances creation?

php - 使用 MySQL 查询结果填充下拉框时出现问题 (PHP/MySQL)

Java - 另一个 "BitmapFactory.decodeByteArray always null"

java - 如何将本地 Google App Engine Python 数据存储复制到本地 Google App Engine Java 数据存储?

Python 模块随机

mysql - 首先根据值(value)选择项目,然后为所有其他项目选择日期顺序

python - 从 GoogleAppEngine 模型中删除重复项?

python - 有人注册时如何在gae上正确存储密码?