基于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中的jquery PyQuery库使用小结
May 13 Python
深入理解python try异常处理机制
Jun 01 Python
Python 模板引擎的注入问题分析
Jan 01 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
Nov 29 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
Linux下升级安装python3.8并配置pip及yum的教程
Jan 02 Python
Django与pyecharts结合的实例代码
May 13 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
python 两种方法删除空文件夹
Sep 29 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
Python实现自动玩连连看的脚本分享
Apr 04 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
实用函数10
2007/11/08 PHP
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
JS实现页面内跳转的简单代码
2017/09/03 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
internal修饰符起什么作用
2013/12/16 面试题
面试求职的个人自我评价
2013/11/16 职场文书
婚礼证婚人证婚词
2014/01/08 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年教研组工作总结
2014/11/26 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
财务部岗位职责范本
2015/04/14 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
MySQL数据库 安全管理
2022/05/06 MySQL