11.1 中间件基础
2025-02-17
- 中间件定义的顺序怎样影响钩子函数的调用顺序
- 钩子函数的作用
- 中间件是插件系统,允许其根据业务场景做定制化
11.1.1 中间件
- 用于视图函数执行之前和执行之后做一些预处理和后处理操作,功能类似装饰器
- 表现形式:Python类,类中定义了固定名称的方法(钩子函数)
- 框架会对每一个HTTP请求在特定的时机执行钩子函数
- 配置地址:
settings.py-->MIDDLEWARE- 标识当前系统加载的中间件
- 默认下:包含的都是Django内置的中间件
中间件包含什么
中间件可以定义:5个钩子函数,名字是固定的
处理请求时,调用视图函数前依次从上到下处理MIDDLEWARE中声明的各个中间件,会有两个钩子函数调用
- process_request
- process_view
处理响应时,调用视图函数后依次从下到上处理MIDDLEWARE中声明的各个中间件,会有三个钩子函数调用
- process_exception
- process_template_response
- process_response
中间件的应用场景
- 如:使用中间件对请求做出拦截,限制用户(可以从HttpRequest中拿到客户端的IP地址)的访问频率,例如1分钟内不允许访问10次。很显然,这需要在访问视图函数之前对用户做校验,因此可以利用
process_request函数完成 - 视图返回JSON数据,需求不同,数据结构很难实现统一
- 可利用中间件对响应对象在做一层封装,统一结构数据,可以利用
process_response函数完成
- 可利用中间件对响应对象在做一层封装,统一结构数据,可以利用
配置和使用中间件的注意事项
- 钩子函数的实现
- 中间件的定义顺序
11.1.2 中间件的钩子函数
process_request
- 请求预处理函数,接受一个参数request,是HttpRequest对象实例,在完成通过URL找到实体函数之前,会调用此钩子函数,后根据函数返回值的不同得到不同的效果
- 返回None:继续处理当前请求 >> 执行其他中间件的process_request >> 执行process_view >> 视图函数
- 返回HttpResponse:不执行后面中间件的process_request和视图函数 >> 执行当前以及刚刚执行过的中间件的process_response方法,直到第一个中间件返回响应