Django:如何统计观看人数
我正在用Django做一个简单的论坛应用,想让每当有人查看一个帖子时,这个帖子的浏览次数(post_view_no)就增加。
目前,我遇到了两个困难:
我需要限制浏览次数的增加,让同一个用户无论刷新或点击帖子多少次,只能增加一次。
我还需要能够追踪那些没有登录的用户。
关于第一个问题,似乎只要创建一个叫“View”的模型并检查数据库就可以了,但我觉得这样可能有点复杂。
至于第二个问题,我能想到的就是用 cookies 或 IP 地址来追踪用户,但 IP 地址并不唯一,而且我不知道怎么使用 cookies。
我相信这是论坛或BBS解决方案中常见的功能,但谷歌搜索只找到了插件或一些“笨”的解决方案,每次查看帖子时都增加浏览次数。
那么,解决这个问题的最佳方法是什么呢?
2 个回答
我想提供一个备用的解决方案,我觉得这个方法可能有效,但也容易被人利用(如果是通过代理或不同的设备访问的话)。我自己也没有尝试过这个方法,但我认为它应该可以工作,而且不需要考虑 cookies,同时你还可以收集一些额外的数据,这样挺不错的。
我会创建一个叫做 TrackedPosts
的模型。
class TrackedPosts(models.Model):
post = models.ForeignKey(Post)
ip = models.CharField(max_length=16) #only accounting for ipv4
user = models.ForeignKey(User) #if you want to track logged in or anonymous
然后,当你查看一个帖子时,你可以获取请求的 IP 地址。
def my_post_view(request, post_id):
#you could check for logged in users as well.
tracked_post, created = TrackedPost.objects.get_or_create(post__pk=id, ip=request.ip, user=request.user) #note, not actual api
if created:
tracked_post.post.count += 1
tracked_post.post.save()
return render_to_response('')
我觉得你可以通过 cookies 来实现这两件事。比如,当用户访问一个页面时,你可以:
检查他们的会话中是否有“viewed_post_%s”这个键(其中 %s 是帖子 ID)。
如果有,就什么都不做。如果没有,就把对应的
Post
对象的view_count
数字字段加一,并在他们的会话中设置这个键(cookie)“viewed_post_%s”,这样以后就不会再算这个浏览次数了。
这种方法适用于匿名用户和注册用户,不过如果用户清除了 cookies 或者设置浏览器拒绝 cookies,他们就可以作弊,影响浏览次数。
在 Django 中使用 cookies(会话)其实很简单:要为当前用户设置一个值,你只需要在你的视图中调用类似下面的代码:
request.session['viewed_post_%s' % post.id] = True
免责声明:这只是我随便想的,我个人没有做过这个。通常在需要进行页面浏览或活动追踪(这样你可以看到哪些内容吸引更多流量,用户什么时候更活跃等等)时,使用一些专业的系统(比如 Google Analytics 或 StatsD)会更有意义。不过对于某些特定的用例,或者作为练习,这个方法应该是可行的。