什么是中间件?
中间件是一个Python程序员用来处理Django的请求和响应的框架级别的钩子,它是一个轻量,低级别的插件系统,用于全局范围内改变Django的输入,输出。每个中间件组件都负责做一些特定的功能。
说的直白一点是中间件就是帮我们程序员在视图函数执行之前和执行之后都可以一些额外的操作,它是一个自定义的类,类中定义了几个方法,Django框架会在请求的特定时间去执行这些方法。
在Python项目中一直都在有使用中间件,在django项目中的setting.py文件中看到MIDDLEWARE配置项:
MIDDLEware是一个列表,列表中是一个个字符串,这些字符串其实是类,也就是中间件。
自定义中间件的规则
1.要继承MIDDLEWAREMIXIN类,
2.要重写父类方法
3.将类添加到setting.py文件中MIDDLEWARE配置项里
父类的五个方法(主要process_request process_response)
process_request(self,request)
process_view(self,request,view_func,view_args,view_kwargs)
process_template_response(self,request,response)
process_exception(self,request,exception)
process_response(self,request,response)
返回值可以是一个NONE,或者HttpResponse对象,如果是none,继续按照django定义的向下执行,如果返回是Httpresponse对象,则直接将该对象返回给用户。
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self,request):
print("MD1里面的 process_request")
def process_response(self,request,response):
print(“MD1里面的process_response”)
return response
中间件的五种方法详解
process_request
process_request有一个参数,就是request ,这个request和视图函数的request一样的。
它的返回值可以是none也可以是httpresponse对象,返回none,就按照正常流程走,交给下个中间件处理,如果是httpresponse对象,django将不执行视图函数,而将相应对象返回给浏览器。
我们看一看多个中间件是怎么执行的,django是如何执行process_request方法的。
在setting.py中MIDDLEWARE配置项中注册上述两个自定义中间件:
此时,我们访问一个视图,发现打印如下内容:
如果把MD1和MD2的位置换一下,再次访问,打印如下内容:
由此总结:
1.中间件的process_request方法是在执行视图函数之前执行的
2.当配置中间件时,会按照MIDDLEWARE的注册顺序,也就是列表的索引值,从前到后依次执行的。
3.不同中间件之间传递的request都是同一个对象。
porcess_response
它有两个参数,一个是request,一个response,request就是上述例子的对象,response是视图返回的httpresponse对象。该方法的返回值也必须是httpresponse对象。
看例子:
访问视图函数,看一下终端的输出:
看结果可知process_response是在视图函数执行之后开始的,并且顺序是MD1比MD2先执行(此时setting,py中MD2比MD1先注册)
多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的,
process_view(self,request,view_func,view_args,view_kargs)
该方法有四个参数
request是httprequest对象。
view_func是即将使用的视图函数,它是实际的函数对象,而不是函数的名称作为字符串。
view_args是将传递给视图位置的参数的列表。
view_kargs是将传递给视图的关键字参数的字典。
view_args和view_kargs都不包含第一个视图参数(request)
django会在调用视图函数之前调用process_view方法。
给MD1和MD2添加process_view方法:
process_exception
process_exception(self,request,exception)
该方法有两个参数:
一个是httpresponse对象
一个是视图函数产生的exception对象
这个函数只有在视图函数抛出异常才可以执行,它返回none或者httpresponse对象,如果是httpresponse对象,django将调用模板和中间件中的process_reponse方法,并将返回给浏览器,否则默认处理异常,如果返回none,则交给下一个中间件的process_exception方法来处理执行,它的执行顺序也是按照中间件注册顺序的倒序执行。
中间件的使用场景
1.做IP限制
放在中间件类的列表中,阻止某些ip访问;
2.URL访问过滤
如果用户访问的是logo视图(放过)
如果访问其他视图,需要检测是否已经有session,已经有了放行,如果没有返回login,这样就省的在多个视图函数上写装饰器了!
3.缓存
客户端请求来了,中间件去缓存看看有没有数据,有直接返回给用户,没有再去逻辑层执行视图函数