个人小结: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晓码阁 版权所有