Django之中间件
一:中间件基础简介#
(1)简介:#
(1)中间件是在视图函数执行之前与执行之后可以进行的一些额外操作
(2)其本质是一个自定义的类 类中定义了几个方法 其会在特定的条件触发这些方法
(2)作用:#
(1):django中间件 可以用来进行身份校验 访问频率限制 权限校验
(2):只要涉及全局校验都可以使用中间件进行校验
(3)django默认中间件#
(1)django默认有七个中间件

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', ]
(4)django请求生命周期#
PS:
(1)上述当客户端的请求到达中间件的时候 其首先会查找缓存数据库
(2)如果缓存数据库查找不到 最终到达数据库查找
(3)当数据库将查找的数据返回 经过中间件的时候 其会将数据分成两份
(4)一份存入缓存数据库中 一份传输给客户端
(5)下次客户端再次获取相同的数据的时候 其不会在进行数据库查询 而是直接去缓存数据库查询
二:自定义中间件#
(1)常见自定义方法#
(1)process_request(self,request)
(2)process_view(self, request, view_func, view_args, view_kwargs)
(3)process_template_response(self,request,response)
(4)process_exception(self, request, exception)
(5)process_response(self, request, response)
(2)自定义方法使用示例#
(1)文件创建图解

from django.utils.deprecation import MiddlewareMixin class MyMiddleWareM1(MiddlewareMixin): pass class MyMiddleWareM2(MiddlewareMixin): pass class MyMiddleWareM3(MiddlewareMixin): pass
(2)process_request

from django.utils.deprecation import MiddlewareMixin class MyMiddleWareM1(MiddlewareMixin): def process_request(self, request): print('我是第一个自定义中间件中的 request方法') class MyMiddleWareM2(MiddlewareMixin): def process_request(self, request): print('我是第一个自定义中间件中的 request方法') class MyMiddleWareM3(MiddlewareMixin): def process_request(self, request): print('我是第一个自定义中间件中的 request方法')
def index(request): print('index 视图函数') return HttpResponse('index 视图函数')
PS:
(1)请求来的时候 会在中间件列表中从上至下依次进行 最后走视图函数
PS:
(1)一旦遇到中间件返回值为HttpResponse对象的时候 就不会再继续往下执行别的中间件
(2)前端收到的返回值 也是为中间件的返回值 而不是后端视图函数的返回值
(3)process_response

class MyMdd(MiddlewareMixin): def process_response(self, request, response): print('我是第一个中间件里面的process_response方法') class MyMdd1(MiddlewareMixin): def process_response(self, request, response): print('我是第二个中间件里面的process_response方法') class MyMdd2(MiddlewareMixin): def process_response(self, request, response): print('我是第三个中间件里面的process_response方法')
PS:
(1)中间件必须将response返回
(2)response包含 后端给前端返回的消息格式
PS:
(1)后端进行相应的时候 中间件执行顺序 为中间件列表从下往上开始执行
(4)process_view

class MyMdd(MiddlewareMixin): def process_view(self, request, view_func, view_args, view_kwargs): print('我是第一个中间件里面的process_view方法') class MyMdd1(MiddlewareMixin): def process_view(self, request, view_func, view_args, view_kwargs): print('我是第二个中间件里面的process_viewe方法') class MyMdd2(MiddlewareMixin): def process_view(self, request, view_func, view_args, view_kwargs): print('我是第三个中间件里面的process_view方法')
PS:
(1)其会在执行视图函数之前触发该方法
(2)在触发该方法的时候 会拿到后端视图函数的内存地址
(5)process_exception

class MyMdd(MiddlewareMixin): def process_exception(self, request, exception): print(exception) # name 'asdasdasd' is not defined print('我是第一个中间件里面的process_exception方法') class MyMdd1(MiddlewareMixin): def process_exception(self, request, exception): print('我是第二个中间件里面的process_exception方法') class MyMdd2(MiddlewareMixin): def process_exception(self, request, exception): print('我是第三个中间件里面的process_exception方法')
def index(request): print('index 视图函数') asdasdasd return HttpResponse('index 视图函数')
# 结果展示 index 视图函数 我是第三个中间件里面的process_exception方法 我是第二个中间件里面的process_exception方法 name 'asdasdasd' is not defined 我是第一个中间件里面的process_exception方法
PS:
(1)其会在后端代码运行错误的时候触发该方法运行
(2)中间件执行顺序 在中间件列表自上而下执行
(6)process_template_response
def index(request): print('我是index视图函数') def render(): return HttpResponse('什么鬼玩意') obj = HttpResponse('index') obj.render = render return obj
PS:
(1)当你返回的HttpResponse对象中必须包含render属性才会触发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!