写在前面
本期内容
- 基于django+hitcount的网页计数器
所需环境
- python
- pycharm或vscode
- django
Django简介
Django 是一个开源的、基于 Python 的高级 Web 应用框架,它遵循模型-视图-模板(Model-View-Template, MVT)设计模式。诞生于2005年,最初由美国《世界在线》新闻组开发,旨在简化复杂性并加速新闻类网站的开发流程。
在 Django 中:
- 模型(Model):负责处理应用程序的数据结构和数据库交互,通过ORM(Object-Relational Mapping)与关系型数据库如MySQL、PostgreSQL等进行连接,定义数据表结构和业务逻辑。
- 视图(View):视图是处理用户请求的核心部分,根据接收到的HTTP请求决定展示哪些数据或执行何种操作,并将结果组织成响应返回给客户端。
- 模板(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)的实例,该模型具备了标题、内容以及访问量统计的功能。
- 首先从django.db.models导入了models模块,这是Django用于定义数据库表结构的基础类库。通过继承models.Model可以创建一个数据库模型类,每个此类实例对应数据库中的一条记录。
- 同时还从django.contrib.contenttypes.fields导入了GenericRelation,这是一个通用关系字段,允许模型与任何其他模型建立多对一的关系,而无需在模型定义时明确指定目标模型。
- HitCount和HitCountMixin来自hitcount.models,这通常是一个用于统计模型对象访问次数的第三方应用。HitCountMixin提供了一些用于处理访问计数的方法和属性,当我们将这个mixin混入到Post模型中时,意味着每个Post对象都可以拥有自己的访问计数功能。
- 定义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。
- DetailView和TemplateView:来自django.views.generic,是Django提供的两种通用视图类,分别用于处理模型实例详情展示和渲染自定义模板。
2.HitCountDetailView:可能来自第三方库如hitcount,这是一个集成访问量统计的详情视图类。
3.定义了一个名为PostMixinDetailView的mixin类,它继承自object。这个mixin提供了一些通用方法和属性,例如设置模型为Post,并在上下文中添加最近六篇博客文章列表和三种不同的文章展示方式。
4.然后定义了四个视图类:
- IndexView:继承了PostMixinDetailView和TemplateView,用于显示博客首页,通过template_name指定了使用的HTML模板文件,并在上下文中注入了最新的六篇博客文章信息。
- PostDetailJSONView:同样继承了PostMixinDetailView和DetailView,但针对的是JSON格式的详情展示,其as_view方法上使用了ensure_csrf_cookie装饰器来确保每次响应都携带CSRF token以进行安全防护。
- PostDetailView:继承了PostMixinDetailView和HitCountDetailView,是一个结合了访问量统计功能的详情视图,但默认情况下只展示文章详情而不执行计数逻辑。
- PostCountHitDetailView:与PostDetailView类似,也是集成访问量统计的详情视图,但是设置了count_hit=True,这意味着当用户查看文章时,会触发一次访问量计数操作。
总结来说,这段代码通过一系列面向对象的设计,实现了博客文章的列表展示、JSON格式详情展示以及具备访问量统计功能的详情页面,并确保了CSRF防护措施。
运行结果
写在后面
我是一只有趣的兔子,感谢你的喜欢!