基于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中os操作文件及文件路径实例汇总
Jan 15 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 Python
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
python实现线程池的方法
Jun 30 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 Python
谈谈Python中的while循环语句
Mar 10 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
Feb 18 Python
对python中return与yield的区别详解
Mar 12 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 Python
Python中npy和mat文件的保存与读取
Apr 24 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
一个简单的MySQL数据浏览器
2006/10/09 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
13个PHP函数超实用
2015/10/21 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
layui 弹出删除确认界面的实例
2019/09/06 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
python调用cmd命令行制作刷博器
2014/01/13 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
python使用RNN实现文本分类
2018/05/24 Python
python实时监控cpu小工具
2018/06/21 Python
python中scikit-learn机器代码实例
2018/08/05 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
高中毕业自我鉴定
2013/12/19 职场文书
大学毕业生自荐书怎么写?
2014/01/06 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
Docker安装MySql8并远程访问的实现
2022/07/07 Servers
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL