商贸网站建设,静安郑州阳网站建设,seo做论坛和企业网站差别,asp做网站引入 1、Django自带7个中间件#xff0c;每个中间件都有各自的功能 2、django能够自定义中间件 3、使用场景#xff1a; 1. 全局身份校验 2. 全局用户权限校验 3. 全局访问频率的校验 ...... 【1】什么是中间件
Django中间件是一个轻量级、可重用的组件#xff0c;用于处理…引入 1、Django自带7个中间件每个中间件都有各自的功能 2、django能够自定义中间件 3、使用场景 1. 全局身份校验 2. 全局用户权限校验 3. 全局访问频率的校验 ...... 【1】什么是中间件
Django中间件是一个轻量级、可重用的组件用于处理Django请求和响应的过程。它提供了对请求和响应进行全局处理的机制可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理。中间件是按照顺序依次执行的每个中间件都可以对请求和响应进行修改、补充或处理。在Django的settings.py配置文件中通过MIDDLEWARE设置来定义中间件的顺序。
【2】中间件的作用 【2.1】认证和授权 中间件可以在请求到达视图之前进行用户认证和权限认证只有经过授权的用户才能访问敏感的资源 【2.2】请求响应和处理 中间件可以在请求到达视图之前进行预处理 例如请求头信息检查请求参数的合法性操作在视图函数返回响应给客户端之前中间件还可以对响应进行后处理 通知还可以添加额外的响应头包装响应数据等操作 【2.3】异常处理 中间件可以捕获视图函数中可能抛出的异常并做出相应的处理 例记录异常日志返回自定义错误信息 【2.4】性能优化 通过中间件可以对性能进行检测缓存处理压缩响应提升网站整体性能等操作 【2.5】示例
class MyMiddleware:def __init__(self, get_response):self.get_response get_responsedef __call__(self, request):# 在视图函数调用之前的预处理逻辑# ...response self.get_response(request)# 在响应返回给客户端之前的后处理逻辑# ...return response
【3】Django中间件是Django的门户 请求操作和响应操作都需要经过中间件 1、请求来的时候需要先经过中间件才能真正到达后盾 2、响应返回的时候也要经过中间件后才能才能响应返回出去 【4】Django默认的7个中间件
【4.1】SecurityMiddleware
django.middleware.security.SecurityMiddleware
安全中间件负责处理与网站安全相关的任务例如设置HTTP头部防止跨站脚本攻击XSS点击劫持等它可以通过配置自定义安全策略来确保网站的安全性。
【4.2】SessionMiddleware
django.contrib.sessions.middleware.SessionMiddleware
会话中间件负责处理用户会话的创建之间存储和检索用户数据。它基于浏览器提供的Cookie或URL传递的会话ID进行会话跟踪并将会话数据存储在后端数据库或缓存中以实现用户状态的跨请求保持。
【4.3】CommonMiddleware
django.middleware.common.CommonMiddleware
通用中间件提供了一些常见而关键的HTTP请求处理功能例如根据请求的HTTP头信息设置语言、时区等。此外它还处理静态文件的serving包括收集静态文件为其生成URL并在开发模式下提供静态文件的serving。
【4.4】CsrfViewMiddleware
django.middleware.csrf.CsrfViewMiddleware
CSRFCross-Site Request Forgery中间件用于防止跨站请求伪造攻击。它在每个POST请求中验证一个CSRF标记确保请求是通过合法的表单提交得到的从而保护用户免受恶意站点的攻击。
【4.5】AuthenticationMiddleware
django.contrib.auth.middleware.AuthenticationMiddleware
认证中间件负责处理用户身份认证相关的任务例如将认证信息关联到请求对象上为每个请求提供一个user对象以便在请求处理过程中轻松地获取和使用用户身份信息。
【4.6】MessageMiddleware
django.contrib.messages.middleware.MessageMiddleware
消息中间件用于在请求处理过程中存储和传递临时的、一次性的用户消息。它允许在HTTP重定向之间跨请求传递消息例如成功或错误提示以改善用户体验。
【4.7】XFrameOptionsMiddleware
django.middleware.clickjacking.XFrameOptionsMiddleware
点击劫持中间件用于防止页面被嵌入到其他网站中从而提供一定的点击劫持保护。它通过设置X-Frame-Options HTTP头部来限制页面的显示方式从而防止恶意网页通过iframe等方式嵌入当前网页。
【5】中间件方法(5个)
【5.1】process_request ------- 必须掌握
(1)执行顺序 按照配置文件中的中间件从上往下执行每一个请求来的时候都需要经过process_request方法该方法有一个request参数(2)没有定义process_request方法 没有定义就直接跳过process_request(3)定义了返回值 如果在自定义的中间件中定义了返回了那么请求将不再继续执行(4)总结 process_request方法就是用来做全局相关的所有限制功能该方法在每个请求到达视图之前被调用可以对请求进行预处理。它接收一个HttpRequest对象作为参数并且没有返回值。
例
class AuthenticationMiddleware:def process_request(self, request):# 在这里进行身份验证操作if not request.user.is_authenticated:# 如果用户未经身份验证则返回HttpResponse或重定向到登录页面
【5.2】process_response ------ 必须掌握
响应被返回的时候需要结束每一个中间件里面的process_response方法 该方法有两个额外的参数 requestresponse该方法必须返回HttpResponse对象 默认是response 支持自定义执行顺序 按照注册的中间件从最后往上依次执行如果没有定义则跳过检验下一个该方法在每个请求结束并且响应返回到客户端之前被调用 可以在此处对响应进行处理它接收一个HttpRequest对象和HttpResponse对象作为参数并且必须返回一个HttpResponse对象
例
class CustomResponseMiddleware:def process_response(self, request, response):# 在这里对响应进行处理response[X-Custom-Header] Custom Valuereturn response
【5.3】process_view
路由匹配成功后执行视图函数之前会自动执行中间件里面的该方法顺序是按照配置文件中注册的中间件从上而下的顺序执行该方法在请求到达视图之前被调用在视图函数执行前执行。 可以在此处进行一些操作如修改请求参数或进行记录等。它接收一个HttpRequest对象和一个视图函数作为参数并且可以返回一个HttpResponse对象或None。
示例
class LoggingMiddleware:def process_view(self, request, view_func, view_args, view_kwargs):# 在这里记录日志logger.info(fRequest received: {request.path})# 返回None继续执行原视图函数return None
【5.4】process_template_response
返回的 HttpResponse 对象有 render 属性的时候才会触发顺序是按照配置文件中注册了的中间件从下往上依次经过该方法在视图函数返回一个TemplateResponse对象时调用。 可以在此处修改模板响应例如添加全局的上下文数据或进行额外的渲染操作。它接收一个HttpRequest对象和一个TemplateResponse对象作为参数并且必须返回一个TemplateResponse对象。
示例
class GlobalContextMiddleware:def process_template_response(self, request, response):# 在这里添加全局的上下文数据response.context_data[global_data] Global Valuereturn response
【5.5】process_exception
当视图函数中出现异常的情况下触发顺序是按照配置文件中注册了的中间件从下往上依次经过该方法在视图函数抛出异常时被调用。 可以在此处捕获异常并进行处理例如返回一个定制的错误页面或进行日志记录等。它接收一个HttpRequest对象和一个异常对象作为参数可以返回一个HttpResponse对象来替代原始的异常响应。
示例
class ErrorHandlerMiddleware:def process_exception(self, request, exception):# 在这里处理异常if isinstance(exception, CustomException):# 如果自定义异常返回一个定制的错误页面return render(request, error.html, {error: str(exception)})else:# 默认情况返回一个500服务器错误return HttpResponseServerError(Internal Server Error)
【6】自定义中间件 第一步在视图文件中新建一个视图函数
def index(request):print(这是视图函数index)return HttpResponse(index 的返回值) 第二步在路由文件中配置路由
from app01 import viewsurlpatterns [path(admin/, admin.site.urls),path(index/,views.index),
] 第三步创建一个py文件在py文件中写自定义中间件
# -*-coding: Utf-8 -*-
# File : my_middle .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time2023/7/17# 引入父类
from django.utils.deprecation import MiddlewareMixinclass MyMiddle(MiddlewareMixin):def process_request(self, request):print(这是第一个自定义中间件中的 process_request 方法)class MyMiddle2(MiddlewareMixin):def process_request(self, request):print(这是第二个自定义中间件中的 process_request 方法) 注意在自定义中间件的时候必须要继承父类MiddlewareMixin 引入父类 from django.utils.deprecation import MiddlewareMixin 第四步在配置文件的中间件中加入自定义中间件
MIDDLEWARE [django.middleware.security.SecurityMiddleware,django.contrib.sessions.middleware.SessionMiddleware,django.middleware.common.CommonMiddleware,django.middleware.csrf.CsrfViewMiddleware,django.contrib.auth.middleware.AuthenticationMiddleware,django.contrib.messages.middleware.MessageMiddleware,django.middleware.clickjacking.XFrameOptionsMiddleware,# 注册自己的中间件(在应用下创建路径会有提示但是如果在项目下创建就没有提示需要自己根据路径书写)app01.mymiddle.my_middle.MyMiddle,# 谁先注册就先执行谁app01.mymiddle.my_middle.MyMiddle2,
]
【6.1】总结 1、如果在第一个 process_request 方法就已经返回了 HttpResponse 对象那么响应被返回的时候是经过所有的中间件里面的 process_response 方法还是会发生其他 会直接走同级别的 process_response 方法 然后直接返回 2、flask框架的中间件也有一个类似的方法 但是flask返回数据就必须经过所有中间件里面的 process_response 方法