博客增加阅读计数
使用django-hitcount给博客增加阅读数功能
博客迁移到基于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)
后续可以统计一天或一周所有点击,统计出一个热榜出来。