实际Web开发过程中,我们经常要统计并显示一个页面的浏览次数。今天我们会以博客的例子,教你如何利用Django开发网页计数器,统计并显示一篇文章的浏览次数。本文的原理可以适用于很多场景,比如统计某一文件的下载次数,统计某一用户在单位时间内的登录次数。本文使用Django 2.0 + Python 3.X实现。

第一步 建立APP,设置URL

我们创建一个叫demo的项目,并利用python manage.py startapp blog创建一个名叫blog的APP,并把它加入到settings.py中INSTALLED_APP里去。另外URLs里添加blog.urls.

# demo/settings.py

urlpatterns = [path('admin/', admin.site.urls),path('blog/', include('blog.urls')),] 

第二步 建立模型Models

定义了一个叫views的字段,用来记录浏览次数。我们还定义了一个叫viewed的方法,使views在每次访问后增加1。注意viewed方法里我们使用了save(update_fields=['views']), 这样我们只需要更新views的字段,而不是更新全表,可以减轻数据库写入的工作量。

# blog/models.py

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
from django.utils.timezone import nowclass Article(models.Model):STATUS_CHOICES = (('d', '草稿'),('p', '发表'),)title = models.CharField('标题', max_length=200, unique=True)slug = models.SlugField('slug', max_length=60)body = models.TextField('正文')pub_date = models.DateTimeField('发布时间', default= now, null=True)create_date = models.DateTimeField('创建时间', auto_now_add=True)mod_date = models.DateTimeField('修改时间', auto_now=True)status = models.CharField('文章状态', max_length=1, choices=STATUS_CHOICES, default='p')views = models.PositiveIntegerField('浏览量', default=0)author = models.ForeignKey(User, verbose_name='作者', on_delete=models.CASCADE)category = models.ForeignKey('Category', verbose_name='分类', on_delete=models.CASCADE, blank=False, null=False)tags = models.ManyToManyField('Tag', verbose_name='标签集合', blank=True)def __str__(self):return self.titleclass Meta:ordering = ['-pub_date']verbose_name = "文章"verbose_name_plural = verbose_nameget_latest_by = 'create_date'def get_absolute_url(self):return reverse('blog:article_detail', args=[str(self.id)])def viewed(self):self.views += 1self.save(update_fields=['views'])

注意: Category和Tag模型我这里省略掉了。如果你不需要它们,可以把这两个字段删掉。

第三步 配置URL

我们只设计了一个URL(例如/blog/article/6/)。你需要在blog文件夹里新建urls.py,并添加如下代码。

# blog/urls.py

from django.urls import path, re_path
from . import views# namespace
app_name = 'blog'urlpatterns = [# 展示文章详情re_path(r'^article/(?P<pk>\d+)/$',views.ArticleDetailView.as_view(), name='article_detail'),]

第四步 编写视图Views

视图编写是本文中最重要的部分。我们使用了Django自带的通用视图,来显示文章详情。

# blog/views.py

from django.views.generic import DetailView
from .models import Articleclass ArticleDetailView(DetailView):model = Articledef get_object(self, queryset=None):obj = super().get_object(queryset=queryset)obj.viewed()return obj

现在我们可以仔细分析下计数器的工作原理了:

  • 用户访问/blog/article/6/, 服务器会根据URL映射关系,调用ArticleDetailView。

  • ArticleDetailView通过URL传递过来的参数(id=6)获取当前文章对象,并通过模板blog/article_detail.html显示。每次通过get_object方法获取文章对象后, 还调用该对象的viewed的方法,使计数增加1。

  • 用户每次重新访问/blog/article/6/或刷新浏览器,计数器都会增加1。

第五步 编写模板

模板非常简单,代码如下:

# blog/templates/blog/article_detail.html

<h3>{{ article.title }}</h3>
<p>类别: {{ article.category }} </p>
<p>日期: {{ article.pub_date | date:"Y-m-j" }}</p>
<p>{{ article.body }}</p>
<p>浏览次数: {{ article.views }}</p>

第六步 查看效果

打开CMD终端进入项目所在文件夹,连续输入 python manage.py makemigrations, python manage.py migrate和python manage.py runserver。下面是最终效果。再刷新下浏览器看看计数器有没有变化吧?

redis实现访问计数器

1 配置Redis

REDIS_HOST = 'localhost'
    REDIS_PORT = 6379
    REDIS_DB = 0

2 编辑mysite/article/list_views.py,下面是关键代码

    import redis# 用于引入本项目settings.py中的变量from django.conf import settings# 引用settings.py中的变量REDIS_HOST,REDIS_PORT,REDIS_DBr = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB)# 没有登录的用户也可以访问这个函数def article_detail(request, id, slug):article = get_object_or_404(ArticlePost, id=id, slug=slug)# total_views:记录文章访问量# 一般通过“对象类型:对象ID:对象属性”来命名一个键total_views = r.incr("article:{}:views".format(article.id))# 将访问此时传递给模板return render(request, "article/list/article_detail.html",{"article": article, "total_views": total_views,})

3 模板中增加访问次数的代码

    <header><h1>{{ article.title }}</h1><p><a href="{% url 'article:author_articles' article.author.username %}">{{ article.author.username }}</a><!-- pluralize的作用:如果total_likes为0或复数,则显示的是likes,如果total_likes为1,则显示like--><span style="margin-left:20px" class="glyphicon glyphicon-thumbs-up">{{ total_likes }}like{{ total_likes | pluralize }}</span><!-- 该文章总的访问此时--><span style="margin-left: 20px">{{ total_views }}view{{ total_views | pluralize }}</span></p></header>

参考:https://mp.weixin.qq.com/s/w_UESI3OvSXiPIqzR346bw

Django开发网页计数器统计页面浏览次数相关推荐

  1. Django实战: 开发网页计数器统计页面浏览次数

    实际Web开发过程中,我们经常要统计并显示一个页面的浏览次数.今天我们会以博客的例子,教你如何利用Django开发网页计数器,统计并显示一篇文章的浏览次数.本文的原理可以适用于很多场景,比如统计某一文 ...

  2. (2)文章页面浏览次数+网站访问次数统计显示

    文章目录 一.插件安装与配置 二.页面显示 三.样式修改 我的个人网站IP地址:139.9.58.252(网站还在备案,域名不可用),现想实现页面浏览次数和网站访问次数的统计显示 一.插件安装与配置 ...

  3. WordPress统计文章页面浏览次数插件WP-PostViews

    平时我们都是通过文章阅读数(浏览次数)来分析文章是否受用户欢迎,而 WordPress 站点的文章/页面的浏览次数虽然我们可以通过纯代码来实现,但是老古个人还是比较喜欢使用这款 WP-PostView ...

  4. wordpress中非插件统计文章浏览次数

    非插件统计文章浏览次数 1.在主题的 functions.php文件的最后一个 ?> 前面添加下面的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  5. 网站页面浏览次数代码mysql_php统计网站/html页面浏览访问次数程序

    本文章来给大这介绍了php自己写的一些常用的网站统计代码写法,用无数据库的与使用数据库及html静态页面浏览资次数统计代码,大家可进入参考. 实例1 直接使用txt文件进行统计的代码 代码如下 复制代 ...

  6. session实现购物系统的简例和application实现统计页面访问次数的简例

    login.jsp <body>   <form action="checkLogin.jsp">   <table>   <tr> ...

  7. js中ajax刷新页面,django+js+ajax实现刷新页面的方法

    本文实例讲述了django+js+ajax实现刷新页面的方法.分享给大家供大家参考,具体如下: 在服务器开发的时候,为了方便将服务器对外开一个接口来操作,可以使用django制作网页,通过页面来操作服 ...

  8. 如何知道页面浏览时长系列之 Web 篇

    一.前言 页面浏览时长是网站分析中很常见的一个指标,反映用户在某些页面上浏览时间的长短,体现了网站用户黏性.然而精确的页面浏览时长是很难统计的,比如需要考虑单页面网页应用路由切换.用户切换浏览器 ta ...

  9. 网页计数器案例———JSP4

    count1.jsp:最基本的 <%@ page contentType="text/html;charset=gbk" import="java.io.*&quo ...

最新文章

  1. TCP/IP 协议理解
  2. OKR和KPI有什么区别?
  3. Java内存使用量测试 看看我们天天在用的JVM到底浪费了多少内存资源
  4. Facebook Libra不会和主权货币竞争
  5. 简单直接的方法解析JSON数据
  6. 线上分享 | AI产品经理之路——从入门到进阶
  7. OpenCV 中的绘制功能
  8. nfs文件服务器以及客户端基本配置
  9. 写一个sql实现以下查询结果_书写高质量SQL的30条建议
  10. 使用mpvue开发小程序
  11. a4988 脉宽要求_基于STM32的微型步进电机驱动控制器设计
  12. moore和mealy_Mealy机和Moore机的比较研究 目录
  13. C盘的“压缩驱动器以节约磁盘空间”有用吗
  14. Mac和iPhone之间如何设置通用剪贴板?
  15. android 5.1 内核版本号,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)
  16. 人人商城小程序下单付款报错:“服务器暂时无法处理您的请求,请稍后再试”
  17. 表达式引擎Aviator基本介绍及使用以及基于Aviator的规则引擎(附代码详细介绍)
  18. 区块链(二)-形象的理解区块链和中心化的技术差异
  19. c语言单片机编程 实例教程,51单片机的C语言编程基础及实例教程
  20. 基于libusb库、uac协议,获取Audio声音数据

热门文章

  1. SQLServer海量数据库的查询优化及分页算法方案
  2. idea sout输出乱码的问题
  3. MYSQL无法识别中文解决方法“一劳永逸”
  4. 网络杂谈-netsh,route...
  5. ADO CreateParameter 0xC0000005 错误原因及解决方法
  6. 影响射频传输距离因数
  7. 下一代计算机 激光,激光显示终端 “下一代电视”将步入百姓生活
  8. java 二十四节气_获取二十四节气示例代码
  9. 什么是正向设计和逆向设计?
  10. How to be a under-graduate student