首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django开发网页计数器统计页面浏览次数

Django开发网页计数器统计页面浏览次数

作者头像
菲宇
发布2019-06-13 11:40:42
2K0
发布2019-06-13 11:40:42
举报
文章被收录于专栏:菲宇菲宇

实际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

我们文章Article的模型model设计比较直观,如下所示。我们定义了一个叫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 now


class 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.title

    class Meta:
        ordering = ['-pub_date']
        verbose_name = "文章"
        verbose_name_plural = verbose_name
        get_latest_by = 'create_date'

    def get_absolute_url(self):
        return reverse('blog:article_detail', args=[str(self.id)])

    def viewed(self):
        self.views += 1
        self.save(update_fields=['views'])

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

第三步 配置URL

我们只设计了一个URL(例如/blog/article/6/)。你需要在blog文件夹里新建urls.py,并添加如下代码。如果你不知道如何设计优美的URL,欢迎阅读【Django核心基础之URL的设计与配置

# 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 Article


class ArticleDetailView(DetailView):
    model = Article

    def 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。下面是最终效果。再刷新下浏览器看看计数器有没有变化吧?

转自https://mp.weixin.qq.com/s/w_UESI3OvSXiPIqzR346bw

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档