博客增加阅读计数

使用django-hitcount给博客增加阅读数功能

avatar_cover Alex Xiang
2024-09-14 255阅读

博客迁移到基于django的wagtail之后,目前基本上已经可用了,这次增加一下阅读数的功能。 给博文增加阅读数其实有很简单的方式,就是在BlogPage的model里增加一个reads字段,每次访问的时候加一,但是了解了django-hitcount组件的功能之后,发现阅读计数远没有这么简单,先不考虑并发的问题(我们的博客一开始就不是用于高并发的场景),但就功能来说,似乎很多功能也都是不可少,比如:

  • 按用户或session、IP去重
  • 记录每次访问的基本信息,比如用户、IP、agent等等
  • 计数的数据在数据库里的保留时间
  • 计数过期时间,单个用户多长时间内访问算一次计数

这些功能django-hitcount都有,看了文档使用也比较简单,所以打算用这个组件来实现博客的阅读计数。不过实际操作还是遇到一些问题,主要是我们的博客系统基于wagtail,一开始就没有拆分出view,官方和网上的一些例子基本上都是基于view去做的,于是自己尝试了一下,下面是最终的结果:

# blog/models.py
from hitcount.models import HitCount, HitCountMixin
from hitcount.views import HitCountMixin as HitCountMixinView
from django.contrib.contenttypes.fields import GenericRelation

......

class BlogPage(Page, HitCountMixin):
    ......
    hit_count_generic = GenericRelation(
        HitCount, object_id_field='object_pk',
        related_query_name='hit_count_generic_relation')

      ......
    def get_context(self, request):
        context = super(BlogPage, self).get_context(request)
        hc = self.hit_count_generic.get_for_object(self)
        HitCountMixinView.hit_count(request, hc)
        return context
        ......      
# templates/blog/blog_page.html
{% load hitcount_tags %}
......
{% get_hit_count for page %}阅读

也可以在

self.hit_count.hits
self.hit_count.hits_in_last(days=7)

后续可以统计一天或一周所有点击,统计出一个热榜出来。

Filter blog posts by tag django wagtail