基于Django统计博客文章阅读量


Posted in Python onOctober 29, 2019

如何精确地记录一篇文章的阅读量是一个比较复杂的问题,不过对于我们的博客来说,没有必要记录的那么精确。因此我们使用一种简单但有效的方式来记录博客文章的阅读量:文章每被浏览一次,则其阅读量 +1,即所谓的文章页面 PV(Page View)数。虽然简单粗暴,但却高效实用。

增加新字段

为了记录文章的浏览量,需要在文章的数据库表中新增一个用于存储阅读量的字段。因此给博客文章的模型新增一个 views 字段:

blog/models.py

class Post(models.Model):
  # ... 其它已有字段
  # 新增 views 字段记录阅读量
  views = models.PositiveIntegerField(default=0, editable=False)

注意 views 字段的类型为 PositiveIntegerField,该类型的值只允许为正整数或 0,因为阅读量不可能为负值。初始化时 views 的值为 0。将 editable 参数设为 False 将不允许通过 django admin 后台编辑此字段的内容。因为阅读量应该根据被访问次数统计,而不应该人为修改。

增加模型方法

一旦用户访问了某篇文章,这时就应该将 views 的值 +1,这个过程最好由 Post 模型自己来完成,因此再给模型添加一个自定义的方法:

blog/models.py

class Post(models.Model):
  # ... 其它已有字段
  # 新增 views 字段记录阅读量
  views = models.PositiveIntegerField(default=0)  
  # ... 其它已有的模型方法
  def increase_views(self):
    self.views += 1
    self.save(update_fields=['views'])

increase_views 方法首先将自身对应的 views 字段的值 +1(此时数据库中的值还没变),然后调用 save 方法将更改后的值保存到数据库。注意这里使用了 update_fields 参数来告诉 Django 只更新数据库中 views 字段的值,以提高效率。

你也许担心如果两个人同时访问一篇文章,更改数据库中的阅读量字段的值时会不会冲突?其实不必担心,我们本来就不是精确地统计阅读量,而且个人博客的流量通常也不会很大,所以偶尔的冲突导致的数据误差是可以忽略不计的。

迁移数据库

一旦更改了模型,就需要迁移数据库,以便让 Django 将更改反应到数据库中。在项目根目录运行如下两条命令:

$ pipenv run python manage.py makemigrations
$ pipenv run python manage.py migrate

关于数据库的迁移,具体可以参考 Django 迁移、操作数据库。

修改视图函数

当用户请求访问某篇文章时,处理该请求的视图函数为 detail 。一旦该视图函数被调用,说明文章被访问了一次,因此我们修改 detail 视图函数,让被访问的文章在视图函数被调用时阅读量 +1。

blog/views.py

def detail(request, pk):
  post = get_object_or_404(Post, pk=pk)
  
  # 阅读量 +1
  post.increase_views()

  md = markdown.Markdown(extensions=[
    'markdown.extensions.extra',
    'markdown.extensions.codehilite',
    # 记得在顶部引入 TocExtension 和 slugify
    TocExtension(slugify=slugify),
  ])
  post.body = md.convert(post.body)

  m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)
  post.toc = m.group(1) if m is not None else ''

  return render(request, 'blog/detail.html', context={'post': post})

即只需在视图函数中调用模型的 increase_views 方法即可。

在模板中显示阅读量

在模板中显示阅读量和显示其它字段一样,只需要使用模板变量即可。即模板适当的地方使用 {{ post.views }} 模板变量。这里我们分别修改两个地方,分别是 index.html 和 detail.html。

templates/blog/index.html

<div class="entry-meta">
 ...
 <span class="views-count"><a href="{{ post.get_absolute_url }}" rel="external nofollow" >{{ post.views }} 阅读</a></span>
</div>

templates/blog/detail.html

<div class="entry-meta">
 ...
 <span class="views-count"><a href="#" rel="external nofollow" >{{ post.views }} 阅读</a></span>
</div>

好了,这样当用户每访问一次文章详情,views 记录的数值就会 +1,从而达到粗略统计阅读量的目的。

示例代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python的Flask框架实现视频的流媒体传输
Mar 31 Python
分享Python文本生成二维码实例
Jan 06 Python
python list排序的两种方法及实例讲解
Mar 20 Python
Python编程判断这天是这一年第几天的方法示例
Apr 18 Python
Python使用 Beanstalkd 做异步任务处理的方法
Apr 24 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
python批量修改文件编码格式的方法
May 31 Python
将pandas.dataframe的数据写入到文件中的方法
Dec 07 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 Python
python中redis包操作数据库的教程
Apr 19 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 #Python
python安装gdal的两种方法
Oct 29 #Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 #Python
pygame实现俄罗斯方块游戏(基础篇1)
Oct 29 #Python
pygame实现五子棋游戏
Oct 29 #Python
python多线程案例之多任务copy文件完整实例
Oct 29 #Python
jenkins配置python脚本定时任务过程图解
Oct 29 #Python
You might like
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
JavaScript大数相加相乘的实现方法实例
2020/10/18 Javascript
Python Web服务器Tornado使用小结
2014/05/06 Python
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
21行Python代码实现拼写检查器
2016/01/25 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
python定时关机小脚本
2018/06/20 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
中华魂放飞梦想演讲稿
2014/08/26 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL