我们在使用Python的一些库时,会遇到中间件这个概念,比如scrapy和Django,那么什么是中间件呢?
什么是中间件中间件就是在目标和结果之间进行的额外处理过程,在Django中就是request和response之间进行的处理,相对来说实现起来比较简单,但是要注意它是对全局有效的,可以在全局范围内改变输入和输出结果,因此需要谨慎使用,否则不仅会造成难以定位的错误,而且可能会影响整体性能 。
中间件有什么用如果想要修改HttpRequest或者HttpResponse,就可以通过中间件来实现 。
- 登陆认证:在中间件中加入登陆认证,所有请求就自动拥有登陆认证,如果需要放开部分路由,只需要特殊处理就可以了 。
- 流量统计:可以针对一些渲染页面统计访问流量 。
- 恶意请求拦截:统计IP请求次数,可以进行频次限制或者封禁IP 。
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',]
只要把添加的中间件配置在这里就可以了 。每一个中间件都是一个类,多个中间件可以写在同一个文件,也可以在独立文件中 。每个中间件可以包含五个方法:process_request(self,request)process_view(self, request, callback, callback_args, callback_kwargs)process_template_response(self,request,response)process_exception(self, request, exception)process_response(self, request, response)
我在网上找到这么一张图片,说明了请求的数据流在Django中间件当中的执行流程![Django中间件看完这篇彻底明白](http://img.jiangsulong.com/220412/1S410IP-0.jpg)
文章插图
中间件函数执行流程
- 请求到达中间件后先依次执行每个中间件的process_request函数
- 然后再依次执行每个中间件的process_view函数,找到我们的视图函数
- 执行视图函数处理请求数据
- 如果在上面的过程中出现异常,则依次反方向执行每个中间件的process_exception函数
- 如果请求包含模板渲染,则依次反方向执行每个中间件的process_template_response函数
- 最后依次反方向执行每个中间件的process_response函数
在这些中间件的执行函数中,我们最常用的就是process_request和process_response函数,通常用来在视图函数处理前和视图函数处理后执行一些相应的操作,这个要根据我们的业务需求,选择不同的处理过程 。例如:进行登陆认证,因为必须要在视图函数处理前进行认证,我们可以在process_request中处理;携带认证cookies信息,就可以在process_response函数中给response对象增加指定cookies值 。
中间件回调函数执行
- Request函数:process_request(self, request)
执行时机:当接收到前端请求,并生成request对象,但是仍未解析url,未确定当前要运行的视图函数 。
如果返回None,Django将继续处理下一个中间件的request函数;如果返回HttpResponse对象,Django将不再执行其他除process_response以外的所有函数,包括后面的process_request函数、其他中间件函数以及视图函数 。 - View函数:process_view(self, request, callback, callback_args, callback_kwargs)
执行时机:在执行完所有中间件的process_request函数,并且已经匹配到要执行的视图函数,但是还没有调用视图函数之前 。
callback:时机要执行的视图函数对象(就是我们所写的视图处理函数)
callback_args:视图函数的位置参数列表(不包含self和request)
callback_kwargs:视图函数的关键字参数
如果返回None,Django将继续处理下一个中间件的request函数;如果返回HttpResponse对象,Django将不再执行其他除process_response以外的所有函数,包括后面的process_request函数、其他中间件函数以及视图函数 。 - Template函数:process_template_response()
执行时机:只有在视图函数的返回对象中有render方法才会执行,并把render方法的返回值返回给用户 。
推荐阅读
- 人的寿命与睡觉方式息息相关?古人说的是哪“三觉”?看完涨知识
- 看完这篇Nginx介绍,你也可以配置属于自己的网站
- 用手挖鼻孔?看完这些你该后悔一整年
- 看完此文章若你还不能完美的入门Python,我将永远退出IT界
- CDN与缓存全面详聊,看完之后,大部分程序员收藏了
- 家庭炒菜时用白醋还是陈醋?看完后明白了,原来差别这么大
- RabbitMQ 使用指南
- 读《幻城》有感 幻城读后感
- MySQL 数据库使用
- 家里退休老人去世了,按照规定有5笔钱可领,看完记得转告家人