V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Hopetree
V2EX  ›  Django

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

  •  
  •   Hopetree ·
    Hopetree · 2018-04-28 17:01:58 +08:00 · 4186 次点击
    这是一个创建于 2402 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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/

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

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

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

    如果真的想更严格一点,那就用 ip 统计吧。与 cookie、session 等关系不大,别钻牛角尖了。
    Hopetree
        6
    Hopetree  
    OP
       2018-04-29 15:09:14 +08:00
    @ashfinal 作为个人博客,这个功能实现实现其实都无所谓,我问这个只是想更加了解一些专业一些的平台是通过什么方式来做这个的,比如博客园,我就发现我上面提到的两个问题都不存在,他们那个就很严格
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5650 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:13 · PVG 16:13 · LAX 00:13 · JFK 03:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.