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

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

写在前面

本期内容

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

所需环境

  • python
  • pycharm或vscode
  • django


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. HitCount和HitCountMixin来自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。
  • 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防护措施。


运行结果

写在后面

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

目录
相关文章
|
14小时前
|
前端开发 JavaScript API
探索现代Web开发中的动态数据交互——前端与后端整合实战
本文探讨了现代Web开发中前端与后端整合的关键技术点,通过实际案例演示了如何利用JavaScript和Node.js实现动态数据交互,全面解析从数据请求到响应的全过程。
|
1天前
|
存储 Apache 文件存储
在Apache环境下为Web网站增设访问控制:实战指南
在Apache服务器上保护网站资源涉及启用访问控制模块(`mod_authz_core`和`mod_auth_basic`),在`.htaccess`或`httpd.conf`中设定权限,如限制对特定目录的访问。创建`.htpasswd`文件存储用户名和密码,并使用`htpasswd`工具管理用户。完成配置后重启Apache服务,访问受限目录时需提供有效的用户名和密码。对于高安全性需求,可考虑更复杂的认证方法。【6月更文挑战第20天】
16 4
|
1天前
|
安全 Ubuntu 应用服务中间件
NGINX环境下实现Web网站访问控制的实战指南
在NGINX中设置基于IP的访问控制可提升网站安全性。步骤包括安装NGINX、备份配置文件、编辑`/etc/nginx/sites-available/default`,添加`allow`和`deny`指令限制特定IP访问,如`allow 192.168.1.100; deny all;`,然后测试配置并重启服务。成功后,仅允许的IP能访问网站,否则会收到403错误。这为Web安全提供基础保障,还可扩展实现更多高级控制策略。【6月更文挑战第20天】
18 3
|
10天前
|
前端开发 JavaScript 开发工具
Web网页前端教程免费:引领您踏入编程的奇幻世界
Web网页前端教程免费:引领您踏入编程的奇幻世界
13 3
|
11天前
|
开发框架 数据库 开发者
Web开发新境界:用Python玩转Django和Flask!
【6月更文挑战第12天】Python的Web开发框架Django和Flask各有千秋。Django是全能型框架,适合快速开发大型应用,提供ORM、模板引擎、URL路由和后台管理等全面功能。Flask则轻量级且灵活,适用于小型到中型应用,以其简单易用、高度可扩展和灵活路由著称。两者结合使用,能应对各种Web开发需求。
|
12天前
|
开发框架 API 数据库
Web实战丨基于Django的简单网页计数器
Web实战丨基于Django的简单网页计数器
26 5
|
14小时前
|
前端开发 JavaScript API
现代Web开发中的前后端分离架构
本篇文章探讨了前后端分离架构在现代Web开发中的应用与优势。
|
16小时前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
|
2天前
|
存储 Java 容器
Web后端开发中对三层架构解耦之控制反转与依赖注入
Web后端开发中对三层架构解耦之控制反转与依赖注入
7 0
|
2天前
|
XML 前端开发 Java
基于Springboot的web后端开发三层架构上手实操
基于Springboot的web后端开发三层架构上手实操
7 0