郑州网站开发顾问,怎么判断一个网站做的好不好,微商城网站建设平台合同范本,有没有免费建网站目录
一.介绍
1.什么是Django中间件
2.作用#xff1a;
3.示例
二.Django请求生命周期流程图
三.Django中间件是Django的门户
四.中间件方法
1.必须掌握的中间件方法
#xff08;1#xff09;process_request:
示例#xff1a;
2.需要了解的中间件方法
#x…目录
一.介绍
1.什么是Django中间件
2.作用
3.示例
二.Django请求生命周期流程图
三.Django中间件是Django的门户
四.中间件方法
1.必须掌握的中间件方法
1process_request:
示例
2.需要了解的中间件方法
1process_view
示例
2process_template_response
示例
3process_exception
示例
五.自定义中间件
1.process_request
1.路由层
2.视图层
3.配置文件
4.自定义中间件
5.总结
1执行顺序
2没有定义process_request
3定义了返回值
4总结
2.process_response
3.小结 一.介绍
1.什么是Django中间件
Django中间件是一个轻量级、可重用的组件用于处理Django请求和响应的过程它提供了对请求和响应进行全局处理的机制可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理中间件是按照顺序依次执行的每个中间件都可以对请求和响应进行修改、补充或处理在Django的setting.py配置文件中通过MIDDLEWARE设置来定义中间件的顺序
2.作用
认证和授权 中间件可以在请求到达视图之前进行用户认证和权限验证确保只有经过授权的用户才能访问敏感资源请求和响应处理 中间件可以在请求到达视图之前对请求进行预处理 例如添加请求头信息、检查请求参数的合法性等造作同时在视图函数返回响应给客户端之前中间件还可以对响应进行后处理 例如添加额外的响应头、包装响应数据等操作异常处理 中间件还可以捕获视图函数中可能抛出的异常并做相应的处理 例如记录异常日志、返回自定义错误信息等性能优化 通过中间件可以对请求进行性能检测缓存处理、压缩响应等操作提升网站的整体性能
3.示例
class MyMiddleware:def __init__(self, get_response):self.get_response get_responsedef __call__(self, request):# 在视图函数调用之前的预处理逻辑# ...response self.get_response(request)# 在响应返回给客户端之前的后处理逻辑# ...return response二.Django请求生命周期流程图 客户端发出HTTP请求请求被Web服务器接收并传递给Django应用程序Django中的WSGI中间件开始处理请求并可进行一些预处理操作中间件将请求传递给URL分发器URL DispatcherURL分发器根据URL模式将请求路由到相应的视图函数或处理器View/Handler视图函数或处理器执行相应的业务逻辑可能会与数据库等外部资源交互视图函数或处理器返回一个HTTP响应对象响应对象经过中间件可以在此进行后处理操作响应被发送给Web服务器Web服务器将响应发送回客户端 三.Django中间件是Django的门户
请求发来的时候需要先经过中间件才能到达真正的Django后端响应返回的时候最后也需要进过中间件返回发送出去
四.中间件方法 Django支持程序员自定义中间件并且给程序员5个中间件 1.必须掌握的中间件方法
1process_request: 执行顺序 请求来的时候需要经过每一个中间件的process_request方法 结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的没有定义process_request 如果没有定义这个方法就跳过这个中间件定义了返回值 如果在自定义中间件中定义了返回值三板斧那么请求将不再继续执行而是直接原路返回校验失败不允许访问总结 process_request方法就是用来做全局相关的所有限制功能 该方法在每个请求到达视图之前被调用可以对请求进行预处理 例如进行身份验证访问控制或请求日志记录等操作它接收一个HttpRequest对象和HttpResponse对象作为参数并且必须返回一个HttpResponse对象
示例
class CustomResponseMiddleware:def process_response(self, request, response):# 在这里对响应进行处理response[X-Custom-Header] Custom Valuereturn response2.需要了解的中间件方法
1process_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 None2process_template_response 返回的 HttpResponse 对象有 render 属性的时候才会触发 顺序是按照配置文件中注册了的中间件从下往上依次经过 该方法在视图函数返回一个TemplateResponse对象时调用。 可以在此处修改模板响应例如添加全局的上下文数据或进行额外的渲染操作。它接收一个HttpRequest对象和一个TemplateResponse对象作为参数并且必须返回一个TemplateResponse对象。
示例
class GlobalContextMiddleware:def process_template_response(self, request, response):# 在这里添加全局的上下文数据response.context_data[global_data] Global Valuereturn response3process_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)五.自定义中间件
1.process_request
1.路由层
from app01 import viewsurlpatterns [path(admin/, admin.site.urls),path(index/,views.index),
]2.视图层
def index(request):print(这是视图函数index)return HttpResponse(index 的返回值)3.配置文件
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,
]4.自定义中间件
# -*-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 方法)5.总结
1执行顺序
请求来的时候需要经过每一个中间件的 process_request 方法结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的
2没有定义process_request
如果没有定义这个方法就跳过这个中间件
3定义了返回值
如果在自定义中间件中定义了返回值(三板斧)那么请求将不再继续执行而是直接原路返回(校验失败不允许访问)
4总结
process_request 方法就是用来 做全局相关的所有限制功能
2.process_response
# 引入父类
from django.utils.deprecation import MiddlewareMixinclass MyMiddle(MiddlewareMixin):def process_request(self, request):print(这是第一个自定义中间件中的 process_request 方法)def process_response(self, request, response)::param request: :param response: 就是Django返回给浏览器的内容:return: print(这是第一个自定义中间件中的 process_response 方法)# 必须返回 responserreturn response响应被返回的时候需要结束每一个中间件里面的 process_response 方法 该方法有两个额外的参数 requestresponse 该方法必须返回 HttpResponse 对象 默认是response支持自定义 顺序是按照配置文件中注册过的中间件从下往上依次经过 如果没有定义则跳过校验下一个
3.小结 如果在第一个 process_request 方法就已经返回了 HttpResponse 对象那么响应被返回的时候是经过所有的中间件里面的 process_response 方法还是会发生其他 会直接走同级别的 process_response 方法 然后直接返回 flask框架的中间件也有一个类似的方法 但是flask返回数据就必须经过所有中间件里面的 process_response 方法