使用 Django 写的博客网站,根据 session 来统计文章浏览量的方式有问题。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Hopetree
V2EX    Django

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

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

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

    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     Solana     1097 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 23:19 PVG 07:19 LAX 16:19 JFK 19:19
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86