Django中间件
Django中间件是Django的门户
- 请求来的时候需要先经过中间件才能达到真正的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', |
| ] |
| |
| |
取其中三个查看源码。
| from django.contrib.sessions.middleware import SessionMiddleware |
| from django.contrib.auth.middleware import AuthenticationMiddleware |
| from django.contrib.messages.middleware import MessageMiddleware |

Django支持程序员自定义中间件并且暴露给程序员五个可以自定义的方法
| 1.process_request |
| 2.process_response |
| 3.process_view |
| 4.process_template_response |
| 5.process_exception |
自定义中间件
如何自定义中间件?
| 1. 在项目名或者应用下创建一个任意名称的文件夹 |
| 2. 在该文件夹内创建一个任意名称的py文件 |
| 3. 在该py文件中需要书写类,这个类必须继承(Middlewa |
| 4. 需要将类的路径以字符串的形式注册到settings配置文件中(MIDDLEWARE) |
| from django.utils.deprecation import MiddlewareMixin |
| |
| |
| class Mymiddleware1(MiddlewareMixin): |
| def process_request(self, request): |
| print('我是第一个process_request方法') |
| |
| def process_response(self, request,response): |
| print('我是第一个process_response方法') |
| return response |
| |
| |
| class Mymiddleware2(MiddlewareMixin): |
| def process_request(self, request): |
| print('我是第二个process_request方法') |
| |
| def process_response(self, request,response): |
| print('我是第二个process_response方法') |
| return response |


process_request: 请求来的时候
| # process_request |
| 1.请求来的时候需要经过每一个中间件里面的process_request方法,结果的顺序是按照匹配文件中注册的中间件从上往下的顺序一次执行。 |
| 2.如果中间件里面没有定义该方法,那么请求将不再继续往后执行 |
| 3.如果该方法返回了HttpResponse对象,那么请求将不再继续往后执行而是直接原路返回(可用作检验用户是否为黑名单,校验失败不允许访问等需要验证的地方) |
| 'process_request方法就是用来做全局相关的所有限制功能' |
process_response: 响应请求走的时候
| 1.响应走的时候需要经过每一个中间件里面的process_response方法,该方法有两个额外的参数request,response。 |
| 2.该方法必须返回一个HttpResponse对象 |
| 2.1默认返回的就是形参request |
| 2.2也可以返回自己的 |
| 3.顺序是按照配置文件中注册从下往上的一次经过,如果没有定义,直接跳过执行下一个 |
如果在第一个process_request方法返回HttpResponse,会怎样?

会直接走同级别的process_request返回。
process_view,process_template_response,process_exception

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了