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 GenericRelationfrom hitcount.models import HitCount, HitCountMixinclass 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, TemplateViewfrom hitcount.views import HitCountDetailViewfrom .models import Postclass PostMixinDetailView(object):"""Mixin to same us some typing.  Adds context for us!"""model = Postdef 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 contextclass IndexView(PostMixinDetailView, TemplateView):template_name = 'blog/index.html'class PostDetailJSONView(PostMixinDetailView, DetailView):template_name = 'blog/post_ajax.html'@classmethoddef 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."""passclass 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……

写在后面

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OR-Tools的CP-SAT求解器常用参数设置与说明

在OR-Tools当中,可以对模型及求解器的常用参数进行设置。这里我们介绍CP-SAT求解器的参数设置,参数设置放在求解对象创建后,如下: solver = cp_model.CpSolver() solver.parameters.max_time_in_seconds = 10 solver.parameters.absolute_gap_limit = 0.05 ...在 solver.p…

消息总线在微服务中的应用

直连式配置中心 上一篇文章介绍了 Spring Cloud 中的分布式配置组件 Config,每个服务节点可以从Config Server 拉取外部配置信息。但是似乎还有一个悬而未决的问题,那就是当服务节点数量非常庞大的时候,我们不可能一台一台服务器挨个去手工触…

Linux系统编程:进程

目录 相关指令 ps指令 top指令 相关函数及其示例 getpid() getpid()示例: fork() 示例: 示例2:fork()返回值 Fathers pid is 14532.This is FartherProcess, pid is 14532.This is SonProcess, pid is 14533. vfork() 示例&am…

Java Socket Server TCP服务端向指定客户端发送消息

实现思路 首先需要知道java里如何创建一个Socket服务器端。 //创建一个服务器端对象ServerSocket server new ServerSocket(); //绑定启动的ip和端口号server.bind(new InetSocketAddress("127.0.0.1",8082));//启动成功后,调用accept()方法阻塞&#xf…

RabbitMQ下载与安装

一、Docker安装 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一:在线拉取 docker pull rabbitmq:3-management方式二:从本地加载 上传到虚拟机中后,使用命令加载镜像即可: docker load -i mq.ta…

Docker上安装配置tomcat

目录 1. 拉取镜像 2. 创建运行镜像 3. 查看是否创建成功 ps:如果出现404错误 tomcat目录结构 1. 拉取镜像 这里使用 tomcat:8.5.40 版本作为安装 docker pull tomcat:8.5.40 2. 创建运行镜像 docker run -d --name tomcat -p 8080:8080 \--privilegedtrue …

改进的 K-Means 聚类方法介绍

引言 数据科学的一个中心假设是,紧密度表明相关性。彼此“接近”的数据点是相似的。如果将年龄、头发数量和体重绘制在空间中,很可能许多人会聚集在一起。这就是 k 均值聚类背后的直觉。 我们随机生成 K 个质心,每个簇一个,并将…

webstorm、vscode、HBuilder配置eslint检查

你们好,我是金金金。 场景 每个人写的代码都有自己所属的风格,所以项目中统一代码风格特别重要,新开的项目中如何快速配置ESLint呢? 安装 npm install --save-dev eslint ----安装eslintnpm install --save-dev eslint-plugin-vu…

事件分发机制:从OnTouchListener开始,按钮变色的Demo

要彻底弄清楚事件分发机制,先要明白OnTouchListener的作用。 我们看下Android 1.6上,OnTouchListener的代码定义,源码在线地址:Android 1.6 sdk4 View.java 可以看到,OnTouchListener就是View类中的一个public接口&am…

django+flask警务案件信息管理系统python-5dg53-vue

1)用户在后台页面各种操作可及时得到反馈。 (2)该平台是提供给多个用户使用的平台,警员使用之前需要注册登录。登录验证后,警员才可进行各种操作[10]。 (3)管理员用户拥有信息新增,修…

Git 实战场景过程(工作总结篇)

目录 前言1. Git远程仓库建立分支,本地未显示1.1 问题所示1.2 知识补充 2. Git暂存内容切换分支2.1 问题所示2.2 知识补充 3. Git放弃修改数据3.1 问题所示3.2 知识补充 4. git merge合并查看差异 前言 主要总结工作中的疑惑点,如果你也有相应的场景&am…

跟着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…

Android进阶之路 - 通过业务(Activity)栈管理业务流程

关于业务栈的管理方式,我在去年刚接触当前项目的时候就想记录一下,但是一直晃晃悠悠拖到了现在,索性在春节前以其收尾也是不错。其实这篇内容在项目中肯定经常用得到,但是关于标题命名我却不知道如何描述… 在实际业务中为了形成业…

leetcode-用栈实现队列

232. 用栈实现队列 前面有道题是用队列实现栈 ,本题反过来了,是使用两个栈来模拟队列。 题解: 我们定义两个栈一个进栈in_stack,一个出栈out_stack,在push数据的时候将数据放入进栈就好,但在pop的时候&a…

【Java】MybatisPlus入门

学习目标 能够基于MyBatisPlus完成标准Dao开发 能够掌握MyBatisPlus的条件查询 能够掌握MyBatisPlus的字段映射与表名映射 能够掌握id生成策略控制 能够理解代码生成器的相关配置 一、MyBatisPlus简介 1. 入门案例 问题导入 MyBatisPlus环境搭建的步骤? 1.1 Sp…

部署实战--修改jar中的文件并重新打包成jar文件

一.jar文件 JAR 文件就是 Java Archive ( Java 档案文件),它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…

Go语言中...(三个点)的使用几个常见情况

①可变参数函数(Variadic Functions): 在函数定义中,“…” 可以用于表示可变参数。这使得函数可以接受任意数量的参数。例如: func sum(nums ...int) int {total : 0for _, num : range nums {total num}return tot…

DPVS 多活部署架构部署

一、目标 利用DPVS部署一个基于OSPF/ECMP的提供HTTP服务的多活高可用的测试环境。 本次部署仅用于验证功能,不提供性能验证。 配置两台DPVS组成集群、两台REAL SERVER提供实际HTTP服务。 注:在虚拟环境里面,通过在一台虚拟服务器上面安装FR…

mybatis查询修改mysql的json字段

前言: mysql5.7版本之后支持json字段类型,推荐mysql8版本,适用于属性不确定的个性化字段,比如: 身份信息{“职业”,“学生”,“兴趣”:“打乒乓球”,“特长”:“跳高,书法”}; 图片信息{“日期”:“2023-12-12 22:12”…

flinkjar开发 自定义函数

编写自定义加密函数,继承ScalarFunction类,实现eval方法,参数个数类型和返回值根据业务来自定义。 import org.apache.flink.table.functions.ScalarFunction; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax…