时间:2021-05-22
如何精确地记录一篇文章的阅读量是一个比较复杂的问题,不过对于我们的博客来说,没有必要记录的那么精确。因此我们使用一种简单但有效的方式来记录博客文章的阅读量:文章每被浏览一次,则其阅读量 +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,从而达到粗略统计阅读量的目的。
示例代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
微信文章阅读量怎么算?公众号阅读量怎么统计?很多朋友对于微信公众号文章的阅读量有一些疑问,想知道微信文章阅读量怎么算?公众号阅读量怎么统计?小编今天来聊一聊
前言如果要统计一篇文章的阅读量,可以直接使用Redis的incr指令来完成。如果要求阅读量必须按用户去重,那就可以使用set来记录阅读了这篇文章的所有用户id,
微信文章怎么刷阅读量?2017微信文章刷量神器是什么?微信公众号文章的阅读量至关重要,所以很多朋友相想知道微信文章怎么刷阅读量?2017微信文章刷量神器是什
很多微信公众号管理员在发表了微信公众号文章后,为了提高微信文章阅读量,会去选择刷阅读量,微信文章刷阅读量都是要付费的哦,没有免费的午餐。那么微信文章刷阅读量
微信打开就算阅读量吗?微信公众号怎么查看阅读量?很多朋友很好奇微信阅读量统计的方法是什么,产生了微信打开就算阅读量吗?微信公众号怎么查看阅读量?的疑问,小编