个人小结:Python中的中间件事Java中的过滤器与拦截器的结合体;
Java中的过滤器的特点:作用于全局,用来拦截所有的request请求,但是它对放行后的操作就不再处理了;
Java中的拦截器的特点:作用于局部,用来拦截部分action请求,除了对request请求进行拦截,放行后的操作依然会经过同一个拦截器;
Python中间件的特点:作用与全局,除了对request请求进行拦截,放行后的操作依然会经过同一个拦截器;
代码论证:
1、项目根目录下创建python package(myWares)
2、自定义一个python文件
# coding=utf-8 from django.utils.deprecation import MiddlewareMixin class Row1(MiddlewareMixin): def process_request(self, request): print("中间件1") def process_view(self, request, callback, callback_args, callback_kwargs): print("中间件视图1") def process_response(self, request, response): print("中间件1返回") return response # 参数里的 response :就是views里面返回的值,所以要继续返回一下,否则客户端收不到数据 class Row2(MiddlewareMixin): def process_request(self, request): print("中间件2") def process_view(self, request, callback, callback_args, callback_kwargs): print("中间件视图2") def process_response(self, request, response): print("中间件2返回") return response class Row3(MiddlewareMixin): def process_request(self, request): print("中间件3") def process_view(self, request, callback, callback_args, callback_kwargs): print("中间件视图3") def process_response(self, request, response): print("中间件3返回") return response
3、settings文件中配置自定义中间件
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', 'myWares.testWare.Row1', 'myWares.testWare.Row2', 'myWares.testWare.Row3' ]
4、配置URL
urlpatterns = [ url(r'^getdata/$', views.getdata_view), url(r'^baseTemp/$', views.baseTemp_view), url(r'^extendsTemp/$', views.extendsTemp_view), url(r'^ware/$', views.IndexView.as_view()), ]
5、创建视图
class IndexView(View): def get(self,request,*args,**kwargs): print u'最终返回值' return HttpResponse('OK')
6、浏览器访问
http://127.0.0.1:8000/ctx/ware/
测试结果如下:
自定义中间件流程图
其他:
views函数如果出现异常,返回会找exception方法,一级一级往上找,如果有处理返回,如果都没有处理就直接返回报错了。
def process_exception(self, request, exception): if isinstance(exception, ValueError): return HttpResponse("出现异常") # 异常处理 views函数里出错了,执行这里,如views里 int('abc') process_template_response(self,request,response) # 如果views中的函数返回的对象中,具有render方法,执行这个方法。
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有