基于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的接口测试框架实例
Nov 04 Python
python基础教程之五种数据类型详解
Jan 12 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
opencv python 图像去噪的实现方法
Aug 31 Python
对python字典过滤条件的实例详解
Jan 22 Python
用Python生成HTML表格的方法示例
Mar 06 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
python des,aes,rsa加解密的实现
Jan 16 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
利用js调用后台php进行数据处理原码
2006/10/09 PHP
php实现的日历程序
2015/06/18 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
可以将word转成html的js代码
2010/04/11 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
Python切片索引用法示例
2018/05/15 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Python Selenium参数配置方法解析
2020/01/19 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
Skyscanner波兰:廉价航班
2017/11/07 全球购物
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
C语言编程练习
2012/04/02 面试题
学员自我鉴定
2014/03/19 职场文书
小学元宵节活动总结
2015/02/06 职场文书
Python加密技术之RSA加密解密的实现
2022/04/08 Python