使用 Django 写的博客网站,根据 session 来统计文章浏览量的方式有问题。

2018-04-28 17:01:58 +08:00
 Hopetree

项目就是一个博客,我用类视图来统计文章的浏览量,代码如下:

class DetailView(generic.DetailView):
    model = Article
    template_name = 'blog/detail.html'
    context_object_name = 'article'

    def get_object(self):
        obj = super(DetailView, self).get_object()
        # 设置浏览量增加时间判断,同一篇文章两次浏览超过半小时才重新统计阅览量,作者浏览忽略
        u = self.request.user
        ses = self.request.session
        the_key = 'is_read_{}'.format(obj.id)
        is_read_time = ses.get(the_key)
        if u != obj.author:
            if not is_read_time:
                obj.update_views()
                ses[the_key] = time.time()
            else:
                now_time = time.time()
                t = now_time - is_read_time
                if t > 60 * 30:
                    obj.update_views()
                    ses[the_key] = time.time()

我的方式就是在 session 里面设置一个绑定文章 ID 的 key,然后每次一个用户第一次浏览的时候就来判断这个 key 有没有一个时间值,如果有就跟当前时间做对比,然后大于半小时就添加一次阅读(当做回阅),如果没有,就说明是新的读者,直接更新浏览量,并且设置一个时间值给 key。

这个方法本身问题不大,可以根据我的要求来更新浏览量,至少同一个用户刷新页面不会使得浏览量增加,但是我发现有 2 个问题:

1、当前用户没有登录的时候流量文章,文章量增加(这个过程没问题),然后用户登录账号重定向到文章页,文章浏览量增加(这个也说的过去,我就当他们是两个不同的用户吧),但是用户注销登录,再次浏览文章,文章又增加浏览量,也就是说,这个注销登录过程使得 session 里面的 key 被删除了,请问,我改怎么改进这个?

2、使用爬虫(比如 python 的 requests )来访问文章,每次访问都可以使得浏览量增加,也就是说 session 的这个设置过程对爬虫请求无效

上面两个问题是我比较纠结的地方,我觉得主要是我对 session 理解不过吧,想通过这个实例来进一步理解 session 的使用,有请大佬们生出援手,给我讲解一下我这个该怎么改,或者说有什么更好的实现方式。

博客链接,你们可以试试我说的上述两种问题(请不要使用爬虫发送大量请求) http://www.tendcode.com/

4207 次点击
所在节点    Django
6 条回复
Hopetree
2018-04-28 17:14:46 +08:00
补充一下,目前我想到的方式是使用 redis 缓存来记录请求者的 IP 地址,然后设置缓存的失效,同时按照上面的方式去对比时间和重新设置时间,但是我觉得这个方式好像并不好,不知道其他的博客和论坛类的网站是怎么实现文章浏览量的统计的
whypool
2018-04-28 17:33:09 +08:00
一种是 pv 统计,直接更新浏览量,不管是不是独立客户
另一种是独立访客统计,只认浏览器,访问页面是时候服务端写个 session,存浏览器 cookie
服务端生成 uuid 的方法很多,统计的时候筛选对比一下 cookie

爬虫是独立访客了,没有客户端的概念,也写不进 cookie

所以统计的维度还是比较多的,ip 啥的也可以
Hopetree
2018-04-28 17:52:20 +08:00
@whypool PV 统计只要刷新就统计一次,不是我想要的,虽然是个人博客没必要注重这些虚的东西,但是我也想做的尽量严格一点,让功能不要那么粗糙。我现在正在看 session 和 cookie 的原理和用法,我觉得这一块主要是涉及这个方面的问题,我可能理解不够,所以方式有待改进
981764793
2018-04-28 20:11:28 +08:00
2 楼说的比较全,基本上就三种统计比较常见 pv uv ip,可以三个都做一下
ashfinal
2018-04-28 20:17:42 +08:00
觉得楼主太较真了。现有的统计逻辑没啥问题。

如果真的想更严格一点,那就用 ip 统计吧。与 cookie、session 等关系不大,别钻牛角尖了。
Hopetree
2018-04-29 15:09:14 +08:00
@ashfinal 作为个人博客,这个功能实现实现其实都无所谓,我问这个只是想更加了解一些专业一些的平台是通过什么方式来做这个的,比如博客园,我就发现我上面提到的两个问题都不存在,他们那个就很严格

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/450722

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX