作品展示网站模板,商城网站免费模板,企业网站结构,公益网站怎么做目录 一、类视图1、基于类的结构2、常见的类视图基类3、类视图的优点4、代码案例 二、中间件1、定义2、工作原理3、自带中间件4、中间件开发流程5、自定义中间件6、案例 一、类视图
类视图#xff08;Class-Based Views#xff09;是 Django 中用于处理 HTTP 请求和生成 HTT… 目录 一、类视图1、基于类的结构2、常见的类视图基类3、类视图的优点4、代码案例 二、中间件1、定义2、工作原理3、自带中间件4、中间件开发流程5、自定义中间件6、案例 一、类视图
类视图Class-Based Views是 Django 中用于处理 HTTP 请求和生成 HTTP 响应的一种方式它们基于 Python 类来定义视图逻辑。
相对于基于函数的视图类视图提供了更结构化、可维护和可扩展的方式来编写 Web 应用程序的视图逻辑。
1、基于类的结构
类视图是 Python 类通常继承自 Django 的通用视图类如 View 、TemplateView、ListView、DetailView 等。每个类视图通常包括一个或多个方法每个方法对应于不同的HTTP请求方法如 GET、POST 等。
2、常见的类视图基类
Django 提供了一些常见的类视图基类它们可以用作基础类以便快速创建常见的视图。以下是一些常见的类视图基类
View最基本的类视图可以从这个基类派生并定义 get()、post() 等方法来处理不同的 HTTP 请求。TemplateView用于渲染模板的类视图通常用于显示静态内容的页面。ListView用于显示对象列表的类视图自动处理分页和对象检索。DetailView用于显示单个对象的详细信息的类视图。CreateView、UpdateView、DeleteView用于创建、更新和删除对象的类视图自动处理表单验证和重定向。RedirectView用于重定向用户到其他URL的类视图。
3、类视图的优点
可维护性和可读性类视图允许将相关的视图逻辑组织成一个类使代码更具可读性和可维护性。每个 HTTP 请求方法通常对应于类中的一个方法例如 get()、post() 等。代码重用可以轻松地创建基础类视图并在多个视图中继承它们从而实现视图逻辑的重用。这有助于减少重复编码提高代码的效率。扩展性类视图支持继承可以构建具有继承关系的视图。就是可以在基础视图上添加或覆盖方法以实现不同的行为。可测试性由于视图逻辑更模块化因此更容易编写单元测试来验证视图的行为。
4、代码案例
# Project 项目中的 urls.py
from django.urls import path,include # 导入 Django 的 path 函数用于配置 URL 路由include 函数用于将其它 URL 模式包含在当前 URL 配置中# URL 配置列表定义了网站的所有 URL 路径和对应的处理程序
urlpatterns [# 配置 URL 路由path(, include(users.urls))
]# users 子应用的 urls.py
from django.urls import path # 导入 Django 的 path 函数用于配置 URL 路由
from .import views # 导入当前目录下的 views.py 文件中的模块或视图函数# URL 配置列表定义 URL 路径和对应的处理程序
urlpatterns [# 使用 path 函数将/register/路径映射到 RegisterView 类视图path(register/,views.RegisterView.as_view()),
]# 子应用的 views.py
from django.views import View # 导入 View 类用于创建类视图
from django.shortcuts import render # 导入 render 函数用于渲染模板
from django.http import HttpResponse # 导入 HttpResponse 类用于创建 HTTP 响应class RegisterView(View):# 处理 GET 请求显示用户注册页面def get(self, request):# 使用 render 函数渲染并返回 register.html 模板return render(request, register.html)# 处理 POST 请求接收并处理用户提交的注册信息def post(self, request):# 打印 request 对象可选用于调试和查看请求信息print(request)# 从 POST 请求中获取用户提交的用户名和密码username request.POST.get(username)password request.POST.get(password)# 打印用户名和密码可选用于调试和查看用户提交的数据print(username)print(password)# 在这里处理用户提交的注册信息例如将信息保存到数据库# 返回一个简单的HTTP响应表示注册成功return HttpResponse(注册成功)在根目录下创建 templates 文件夹。
# setting.py
# 设置模板引擎配置包括模板目录、模板上下文处理器等。
TEMPLATES [{# Django 模板引擎的配置项BACKEND: django.template.backends.django.DjangoTemplates,# 额外的模板目录留空表示使用默认的模板目录DIRS: [BASE_DIR / templates],# 表示启用应用程序模板目录APP_DIRS: True,# Django 模板引擎配置的一部分用于指定模板上下文处理器context processors的选项OPTIONS: {# 一个列表用于指定要应用的模板上下文处理器。context_processors: [# Django 自带的模板上下文处理器django.template.context_processors.debug,# Django 自带的模板上下文处理器django.template.context_processors.request,# Django 自带的模板上下文处理器django.contrib.auth.context_processors.auth,# Django 自带的模板上下文处理器django.contrib.messages.context_processors.messages,],},},
]在 templates 文件夹下新建 register.html 文件并编写。
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
bodyform action# methodpostusername: input typetext idusername nameusernamebrpassword: input typepassword idpassword namepassword brregister: button typesubmit注册/button/form
/body
/html二、中间件
1、定义
用于在请求和响应处理过程中执行预定义的操作。
中间件可以在 HTTP 请求到达视图之前和响应返回给客户端之前执行各种任务例如身份验证、日志记录、性能优化、安全性检查等。 2、工作原理
请求阶段
当用户发送 HTTP 请求时Django 中间件首先介入。请求在到达视图之前通过一系列中间件按顺序处理。每个中间件都可以选择处理请求、修改请求、记录信息或执行其他操作。
视图处理
请求最终到达视图函数视图函数处理请求并生成一个 HTTP 响应。
响应阶段
响应在返回给客户端之前通过一系列中间件按相反的顺序处理。每个中间件都可以选择处理响应、修改响应、记录信息或执行其他操作。 请求是从上往下响应是从下往上。 3、自带中间件
SecurityMiddlewaredjango.middleware.security.SecurityMiddleware 功能提供基本的安全性功能。作用例如设置点击劫持保护、X-Content-Type-Options 头部等。用途增加 Web 应用程序的安全性。 SessionMiddlewaredjango.contrib.sessions.middleware.SessionMiddleware 功能处理会话数据。作用存储和管理用户的会话信息。用途用于跟踪用户会话状态允许在不同请求之间共享数据。 CommonMiddlewaredjango.middleware.common.CommonMiddleware 功能提供一些常见的 HTTP 处理功能。作用例如URL 规范化、缓存控制、Content-Type 头部处理等。用途用于执行一些通用的 HTTP 操作以确保 Web 应用程序的正常运行。 CsrfViewMiddlewaredjango.middleware.csrf.CsrfViewMiddleware 功能用于防止跨站请求伪造CSRF攻击。作用生成和验证 CSRF 令牌确保 POST 请求的来源合法。用途提供安全性保护确保用户提交的表单是合法的。 AuthenticationMiddlewaredjango.contrib.auth.middleware.AuthenticationMiddleware 功能在每个请求中更新用户的身份信息。作用根据会话中的用户信息识别用户并将 request.user 设置为当前用户对象。用途管理用户身份验证状态允许用户登录和注销。 MessageMiddlewaredjango.contrib.messages.middleware.MessageMiddleware 功能在请求和响应之间传递消息。作用支持在一次请求中显示一次性消息例如成功消息或错误消息。用途用于向用户呈现提示、通知和消息。 XFrameOptionsMiddlewaredjango.middleware.clickjacking.XFrameOptionsMiddleware 功能设置 HTTP 响应的 X-Frame-Options 头部以控制页面的嵌套防止点击劫持攻击。作用增加网页的安全性防止在 iframe 中嵌套网页。用途保护网页免受点击劫持攻击。
4、中间件开发流程
在项目中创建一个用于存放中间件代码的文件夹。在此文件夹中进行中间件的设计。中间设计好了之后需要将自定义的中间件注册到项目之中。
5、自定义中间件
1、在子应用中创建自定义中间件文件 middlewarse.py。
# users 子应用的 middlewarse.py
from django.http import HttpResponse # 导入 HttpResponse 类用于创建自定义 HTTP 响应对象
from django.utils.deprecation import MiddlewareMixin # 导入 MiddlewareMixin 类它是编写中间件的基类用于方便地定义中间件类# 定义中间件类 MD1继承自 MiddlewareMixin
class MD1(MiddlewareMixin):# 在请求处理之前执行的方法def process_request(self, request):print(md1 process_request 方法, id(request))# 在响应返回客户端之前执行的方法def process_response(self, request, response):print(md1 process_response 方法, id(request))# 返回响应对象可以对响应进行修改或不做修改return response# 在视图函数被调用之前执行的方法def process_view(self, request, view_func, view_args, view_kwargs):print(md1 process_view 方法)# 调用视图函数并传递请求对象return view_func(request)# 在视图函数抛出异常时执行的方法def process_exception(self, request, exception):print(md1 process_exception 方法)# 返回一个带有异常信息的 HTTP 响应对象return HttpResponse(exception)# 定义中间件类 MD2继承自 MiddlewareMixin
class MD2(MiddlewareMixin):# 在请求处理之前执行的方法def process_request(self, request):print(md2 process_request 方法, id(request))# 在响应返回客户端之前执行的方法def process_response(self, request, response):print(md2 process_response 方法, id(request))# 返回响应对象可以对响应进行修改或不做修改return response# 在视图函数被调用之前执行的方法def process_view(self, request, view_func, view_args, view_kwargs):print(md2 process_view 方法)# 调用视图函数并传递请求对象return view_func(request)# 在视图函数抛出异常时执行的方法def process_exception(self, request, exception):print(md2 process_exception 方法)# 返回一个带有异常信息的 HTTP 响应对象return HttpResponse(exception)# 运行结果
# md1 process_request 方法 140083017419800
# md2 process_request 方法 140083017419800
# md2 process_response 方法 140083017419800
# md1 process_response 方法 1400830174198002、在 settings.py 中的中间件的位置加入以下代码。
# settings.py
# 中间件
MIDDLEWARE [# 导入自定义的中间件类users.middlewarse.MD1, users.middlewarse.MD2,
]6、案例
做 IP 访问频率限制
# users 子应用的 middlewarse.py
import time # 导入 time 模块用于计算时间间隔、获取当前时间等操作
from django.utils.deprecation import MiddlewareMixin # 导入 MiddlewareMixin 类它是编写中间件的基类用于方便地定义中间件类
from django.http import HttpResponse # 导入 HttpResponse 类用于创建自定义 HTTP 响应对象# 创建一些变量和设置
white [127.0.0.1] # 白名单
black [127.0.0.2] # 黑名单
ban {} # 小黑屋
ban_seconds 3 # 三秒内
ban_limit 5 # 三秒内允许访问5次
ban_time 30 # 被封时间30秒# 定义中间件类 AuthMD继承自 MiddlewareMixin
class AuthMD(MiddlewareMixin):# 在每个请求处理之前执行的方法def process_request(self, request):ip str(request.META.get(REMOTE_ADDR)) # 获取请求的 IP 地址if ip in black:return HttpResponse(禁止访问, status403) # 如果 IP 在黑名单中返回 403 状态码# 如果是第一次请求if not ban.get(ip):ban[ip] {total: 1, time: int(time.time()), banTime: } # 如果 IP 不在小黑屋中初始化相关信息print(ip, ban[ip].get(total)) # 打印 IP 和访问次数# 如果不是第一次请求则判断上次请求和这次请求是否在合法时间内if ban[ip][time] ban_seconds int(time.time()):# 如果是三秒内判断访问次数if ban[ip][total] ban_limit:ban[ip][banTime] int(time.time()) ban_time # 如果在封禁时间内访问次数超过限制设置封禁时间return self.ban_response() # 返回封禁响应ban[ip][total] 1 # 如果没有大于限制次数print(ban) # 增加访问次数并打印小黑屋信息# 如果不是在合法时间内请求else:limit_time ban[ip][banTime] # 先根据此 IP 找封的时间if limit_time and limit_time int(time.time()):return self.ban_response() # 如果在封禁时间内返回封禁响应del ban[ip] # 否则从小黑屋中移除 IP 地址# 定义封禁响应方法def ban_response(self):return HttpResponse(f访问过于频繁请{ban_time}秒后重试)# 在每个响应返回客户端之前执行的方法def process_response(self, request, response):return response # 返回原始响应对象不做修改# settings.py
# 中间件
MIDDLEWARE [# 导入自定义的中间件类users.middlewarse.AuthMD,
]记录学习过程欢迎讨论交流尊重原创转载请注明出处~