Web实战丨基于django+hitcount的网页计数器

文章目录

  • 写在前面
  • Django简介
  • 主要程序
  • 运行结果
  • 系列文章
  • 写在后面

写在前面

本期内容

  • 基于django+hitcount的网页计数器

所需环境

  • python
  • pycharm或vscode
  • django

下载地址

  • https://download.csdn.net/download/m0_68111267/88795611

Django简介

Django 是一个开源的、基于 Python 的高级 Web 应用框架,它遵循模型-视图-模板(Model-View-Template, MVT)设计模式。诞生于2005年,最初由美国《世界在线》新闻组开发,旨在简化复杂性并加速新闻类网站的开发流程。

在 Django 中:

  1. 模型(Model):负责处理应用程序的数据结构和数据库交互,通过ORM(Object-Relational Mapping)与关系型数据库如MySQL、PostgreSQL等进行连接,定义数据表结构和业务逻辑。

  2. 视图(View):视图是处理用户请求的核心部分,根据接收到的HTTP请求决定展示哪些数据或执行何种操作,并将结果组织成响应返回给客户端。

  3. 模板(Template):提供了一种强大的模板语言,用于分离HTML和其他 presentation 逻辑,使得开发者能够专注于界面设计而不涉及后端代码。

除此之外,Django 还包含丰富的功能特性,如内置的认证系统、URL路由机制、分页和缓存支持、管理后台(Admin)、中间件系统以及面向对象的配置方法等。这些组件共同构成了一个高度可扩展且安全的Web开发环境,适用于快速开发复杂的、数据库驱动的网站和API服务。

Django 强调“ batteries included ”的理念,自带了许多开箱即用的功能模块,减轻了开发者的工作负担,同时其遵循最佳实践的设计原则有助于构建高质量、可维护的应用程序。为了方便开发与测试,Django 开发服务器(如 wsgiref)允许在本地搭建简易的开发环境,而部署到生产环境时,则可以无缝切换到各种高性能的WSGI服务器。

主要程序

  • models.py
from django.db import models
from django.contrib.contenttypes.fields import GenericRelation

from hitcount.models import HitCount, HitCountMixin


class Post(models.Model, HitCountMixin):
    title = models.CharField(max_length=200)
    content = models.TextField()
    hit_count_generic = GenericRelation(
        HitCount, object_id_field='object_pk',
        related_query_name='hit_count_generic_relation')

    def __str__(self):
        return "Post title: %s" % self.title

这段代码来自Django框架中一个创建博客文章模型(Post)的实例,该模型具备了标题、内容以及访问量统计的功能。

  1. 首先从django.db.models导入了models模块,这是Django用于定义数据库表结构的基础类库。通过继承models.Model可以创建一个数据库模型类,每个此类实例对应数据库中的一条记录。

  2. 同时还从django.contrib.contenttypes.fields导入了GenericRelation,这是一个通用关系字段,允许模型与任何其他模型建立多对一的关系,而无需在模型定义时明确指定目标模型。

  3. HitCountHitCountMixin来自hitcount.models,这通常是一个用于统计模型对象访问次数的第三方应用。HitCountMixin提供了一些用于处理访问计数的方法和属性,当我们将这个mixin混入到Post模型中时,意味着每个Post对象都可以拥有自己的访问计数功能。

  4. 定义Post模型,包含两个字段:

    • title:CharField类型,表示文章标题,最大长度为200个字符。
    • content:TextField类型,用于存储文章的主体内容,可容纳大量文本数据。
  5. hit_count_generic字段是GenericRelation类型的,它关联到了HitCount模型,这样每个Post对象就可以有零个或多个相关的HitCount对象,用来记录该文章被访问的次数。这里设置了object_id_field='object_pk'是因为HitCount需要知道关联的是哪个对象以及其主键值,related_query_name='hit_count_generic_relation'则是为了方便查询时使用的别名。

  6. 最后,定义了__str__方法,这是Python的特殊方法,用于返回对象的字符串表示形式,在调试和输出时非常有用。在这个例子中,返回的是文章标题的字符串形式。

  • views.py
from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.generic import DetailView, TemplateView

from hitcount.views import HitCountDetailView

from .models import Post


class PostMixinDetailView(object):
    """
    Mixin to same us some typing.  Adds context for us!
    """
    model = Post

    def get_context_data(self, **kwargs):
        context = super(PostMixinDetailView, self).get_context_data(**kwargs)
        context['post_list'] = Post.objects.all()[:6]
        context['post_views'] = ["ajax", "detail", "detail-with-count"]
        return context


class IndexView(PostMixinDetailView, TemplateView):
    template_name = 'blog/index.html'


class PostDetailJSONView(PostMixinDetailView, DetailView):
    template_name = 'blog/post_ajax.html'

    @classmethod
    def as_view(cls, **initkwargs):
        view = super(PostDetailJSONView, cls).as_view(**initkwargs)
        return ensure_csrf_cookie(view)


class PostDetailView(PostMixinDetailView, HitCountDetailView):
    """
    Generic hitcount class based view.
    """
    pass


class PostCountHitDetailView(PostMixinDetailView, HitCountDetailView):
    """
    Generic hitcount class based view that will also perform the hitcount logic.
    """
    count_hit = True

……(请下载后查看完整代码)

这段代码是基于Django框架实现的一个博客应用的视图类定义,主要用于展示博客文章列表以及单篇文章详情,并且集成了访问量统计功能。

  1. 首先导入了几个关键模块:

    • ensure_csrf_cookie:来自django.views.decorators.csrf,用于确保视图返回的响应包含CSRF(跨站请求伪造)保护的cookie。
    • DetailViewTemplateView:来自django.views.generic,是Django提供的两种通用视图类,分别用于处理模型实例详情展示和渲染自定义模板。
  2. HitCountDetailView:可能来自第三方库如hitcount,这是一个集成访问量统计的详情视图类。

  3. 定义了一个名为PostMixinDetailView的mixin类,它继承自object。这个mixin提供了一些通用方法和属性,例如设置模型为Post,并在上下文中添加最近六篇博客文章列表和三种不同的文章展示方式。

  4. 然后定义了四个视图类:

    • IndexView:继承了PostMixinDetailViewTemplateView,用于显示博客首页,通过template_name指定了使用的HTML模板文件,并在上下文中注入了最新的六篇博客文章信息。

    • PostDetailJSONView:同样继承了PostMixinDetailViewDetailView,但针对的是JSON格式的详情展示,其as_view方法上使用了ensure_csrf_cookie装饰器来确保每次响应都携带CSRF token以进行安全防护。

    • PostDetailView:继承了PostMixinDetailViewHitCountDetailView,是一个结合了访问量统计功能的详情视图,但默认情况下只展示文章详情而不执行计数逻辑。

    • PostCountHitDetailView:与PostDetailView类似,也是集成访问量统计的详情视图,但是设置了count_hit=True,这意味着当用户查看文章时,会触发一次访问量计数操作。

总结来说,这段代码通过一系列面向对象的设计,实现了博客文章的列表展示、JSON格式详情展示以及具备访问量统计功能的详情页面,并确保了CSRF防护措施。

运行结果

1
2

系列文章

序号目录直达链接
1入门实战丨基于Tkinter的简易计算器https://want595.blog.csdn.net/article/details/131731173
2入门实战丨基于Tkinter的生日管理系统https://want595.blog.csdn.net/article/details/131731380
3数据库实战丨基于Tkinter+MySQL的学生成绩管理系统https://want595.blog.csdn.net/article/details/130992721
4数据库实战丨基于Tkinter+MySQL的梅西生涯数据管理系统https://want595.blog.csdn.net/article/details/130995564
5Web实战丨基于Django与Bootstrap的在线计算器https://want595.blog.csdn.net/article/details/134424381
6Web实战丨基于django+html+css的在线购物商城https://want595.blog.csdn.net/article/details/135466052
7Web实战丨基于django+html+css+js的电子商务网站https://want595.blog.csdn.net/article/details/135506809
8Web实战丨基于Django与HTML的用户登录验证系统https://want595.blog.csdn.net/article/details/135513413
9Web实战丨基于django+html+css+js的学院门户网站https://want595.blog.csdn.net/article/details/135511066
10Web实战丨基于Django与HTML的新闻发布系统https://want595.blog.csdn.net/article/details/135519824
11Web实战丨基于django+html+css+js的在线博客网站https://want595.blog.csdn.net/article/details/135536765
12……

写在后面

我是一只有趣的兔子,感谢你的喜欢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/367075.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊聊DoIP吧(一)

DoIP是啥? DoIP代表"Diagnostic over Internet Protocol",即互联网诊断协议。它是一种用于在车辆诊断中进行通信的网络协议。DoIP的目标是在现代汽车中实现高效的诊断和通信。通过使用互联网协议(IP)作为通信基础,DoIP使得诊断信息能够通过网络进行传输,从而提…

指针的学习1

目录 什么是指针? 野指针 造成野指针的原因: 如何避免野指针? 内存和指针 如何理解编址? 指针变量和地址 取地址操作符& 指针变量和解引用操作符 指针变量 如何拆解指针类型? 指针变量的大小 指针变量…

闲聊电脑(4)硬盘分区

夜深人静,万籁俱寂,老郭趴在电脑桌上打盹,桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭:冰箱大哥,上次你说的那个“分区”和“格式化”是什么意思? 冰箱:分区么,就是分…

基于WordPress开发微信小程序1:搭建Wordpress

2年前,在知乎上提问:多数公司为什么宁愿自研也不用wordpress二次开发建站? - 知乎 (zhihu.com),收到了,很多回答 自己打算做一下提升,便有了自己基于wordpress开发微信小程序的想法 项目定位 基于wordpre…

【机器学习】科学库使用手册第2篇:机器学习任务和工作流程(已分享,附代码)

本系列文章md笔记(已分享)主要讨论人工智能相关知识。主要内容包括,了解机器学习定义以及应用场景,掌握机器学习基础环境的安装和使用,掌握利用常用的科学计算库对数据进行展示、分析,学会使用jupyter note…

MATLAB知识点: 矩阵元素的修改和删除

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章 3.3.3 矩阵元素的修改和删除 我们可以直接利用等…

记录关于node接收上传文件formData踩的坑

1.vue2使用插件formidable实现接收文件,首先接口不可以使用任何中间件,否则form.parse()方法不执行。 const express require(express) const multipart require(connect-multiparty); const testController require(../controller/testController)/…

定义HarmonyOS IDL接口

HarmonyOS IDL简介 HarmonyOS Interface Definition Language(简称HarmonyOS IDL)是HarmonyOS的接口描述语言。HarmonyOS IDL与其他接口语言类似,通过HarmonyOS IDL定义客户端与服务端均认可的编程接口,可以实现在二者间的跨进程…

YOLOv5改进 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(轻量化Neck、全网独家首发)

一、本文介绍 本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块和特征融合模块,在本文的下面均会有讲解,…

AJAX-认识URL

定义 概念:URL就是统一资源定位符,简称网址,用于访问网络上的资源 组成 协议 http协议:超文本传输协议,规定浏览器和服务器之间传输数据的格式;规定了浏览器发送及服务器返回内容的格式 协议范围&#xf…

flutter抓包绕过

lutter的证书校验 起因: 最近工作上让做个app的复测,把apk发我后,开始尝试挂代理抓包,结果发现抓不到 为是证书没弄好,想着前几天不是刚导入了吗(雾)。又重新导入了下还是不行。然后各种lsp模…

IDEA中的Run Dashboard

Run Dashboard是IntelliJ IDEA中的工具【也就是View中的Services】,提供一个可视化界面,用于管理控制应用程序的运行和调试过程。 在Run DashBoard中,可以看到所有的运行配置,以及每个配置的运行状态(正在运行&#xf…

嵌入式—— IIC

目录 一、初识IIC 1. 介绍 2. 理解 二、IIC的简单拆分 1. 物理层 特点: 2. 协议层 (1)IIC基本读写过程 具体过程描述: (2)通信的起始和停止信号 (3)数据有效性 &#xf…

模拟请求ElasticSearch

Step1 安装chrome的这个插件 Step2 打开插件,GET的json填什么。 在IDEA的debug模式,走到Java代码的searchBuilder, 在这个searchBuilder变量里,对里面query变量点右侧 view按钮, IDEA里会显示出一个json&#xff…

带着问题读源码——Spring MVC是怎么找到接口实现类的?

引言 我们的产品主打金融服务领域,以B端客户为我们的核心合作伙伴,然而,我们的服务最终将惠及C端消费者。在技术实现上,我们采用了公司自主研发的微服务框架,该框架基于SpringBoot,旨在提供高效、可靠的服…

10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)MS1023/MS1224

产品简述 MS1023 串化器和 MS1224 解串器是一对 10bit 并串 / 串并转 换芯片,用于在 LVDS 差分底板上传输和接收 10MHz 至 80MHz 的并行字速率的串行数据。起始 / 停止位加载后,转换为负载编 码输出,串行数据速率介于 120Mbps…

优化:Dynamo根据构件坐标XY值排序

Hello 大家好!我是九哥~ 前一阵群里有个小伙伴咨询如何按 XY 坐标给桩编码,当时呢也没过多思考,就把常规的逻辑告诉他了,利用 Dynamo 自带的 List.SortByKey 节点,根据族放置坐标的 XY 值进行两次排序,就能…

跟着cherno手搓游戏引擎【19】抽象纹理

引入: 导入stb_image: GitHub - nothings/stb: stb single-file public domain libraries for C/C 下载复制stb_image.h的内容(8000多行),然后粘到如图位置 stb_image.cpp: #include"ytpch.h" #define STB_IMAGE_IM…

面试八股文(3)

文章目录 1.HashSet如何检查重复2.comparable和Comparator区别3.ConcurrentHashMap和Hashtable区别4.线程和进程5.并发与并行的区别6.为什么使用多线程7.使用多线程可能带来问题8.线程的生命周期和状态9.什么是上下文切换10.线程死锁11.产生死锁四个条件12.如何避免死锁 1.Hash…

双非本科准备秋招(14.1)—— 力扣刷题

今天做两个有点难度的题。 1、295. 数据流的中位数 手写堆实现: 加入元素: 如何维护一个中位数?我们考虑一下堆的特点,大顶堆堆顶是一个最大值,小顶堆堆顶是一个最小值,那么,如果我们可以把数…