Django:如何统计观看人数

2 投票
2 回答
7119 浏览
提问于 2025-04-18 16:22

我正在用Django做一个简单的论坛应用,想让每当有人查看一个帖子时,这个帖子的浏览次数(post_view_no)就增加。

目前,我遇到了两个困难:

  • 我需要限制浏览次数的增加,让同一个用户无论刷新或点击帖子多少次,只能增加一次。

  • 我还需要能够追踪那些没有登录的用户。

关于第一个问题,似乎只要创建一个叫“View”的模型并检查数据库就可以了,但我觉得这样可能有点复杂。

至于第二个问题,我能想到的就是用 cookies 或 IP 地址来追踪用户,但 IP 地址并不唯一,而且我不知道怎么使用 cookies。

我相信这是论坛或BBS解决方案中常见的功能,但谷歌搜索只找到了插件或一些“笨”的解决方案,每次查看帖子时都增加浏览次数。

那么,解决这个问题的最佳方法是什么呢?

2 个回答

1

我想提供一个备用的解决方案,我觉得这个方法可能有效,但也容易被人利用(如果是通过代理或不同的设备访问的话)。我自己也没有尝试过这个方法,但我认为它应该可以工作,而且不需要考虑 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('')
3

我觉得你可以通过 cookies 来实现这两件事。比如,当用户访问一个页面时,你可以:

  1. 检查他们的会话中是否有“viewed_post_%s”这个键(其中 %s 是帖子 ID)。

  2. 如果有,就什么都不做。如果没有,就把对应的 Post 对象的 view_count 数字字段加一,并在他们的会话中设置这个键(cookie)“viewed_post_%s”,这样以后就不会再算这个浏览次数了。

这种方法适用于匿名用户和注册用户,不过如果用户清除了 cookies 或者设置浏览器拒绝 cookies,他们就可以作弊,影响浏览次数。

在 Django 中使用 cookies(会话)其实很简单:要为当前用户设置一个值,你只需要在你的视图中调用类似下面的代码:

request.session['viewed_post_%s' % post.id] = True

就完成了。(可以查看 文档,特别是 示例。)

免责声明:这只是我随便想的,我个人没有做过这个。通常在需要进行页面浏览或活动追踪(这样你可以看到哪些内容吸引更多流量,用户什么时候更活跃等等)时,使用一些专业的系统(比如 Google Analytics 或 StatsD)会更有意义。不过对于某些特定的用例,或者作为练习,这个方法应该是可行的。

撰写回答