首先了解下在django中请求处理的过程:html
浏览器发起请求 --》 匹配url成功 --》运行view视图函数 --》 调用html模板 --》返回给浏览器。
python
面向切面编程:就是在一种开发好的框架,上述过程当中,任意箭头位置打断正常流程,加入一些干预的处理环节,从而实现更多功能且不影响原来的框架流程。django
根据以上要求,最简单的方法就是修改django的源代码,但这样对通常人来讲很是有难度,因此,django在框架设计中,就预留出来了这些处理环节,用户在使用时,根据实际须要选择修改或者不修改便可。编程
在django中经过提供了一种面向切面编程的工具就叫中间件;实际上中间件就是一个python的类,有固定的6中方法可实现:vim
(1)_init_:服务器响应第一个请求时调用一次,用于肯定是否启用当前中间件;浏览器
(2)process_request(request):执行视图前被调用,在每一个请求上调用,返回None或HttpResponse对象;bash
(3)process_view(request, view_func, view_args, view_kwargs):调用视图前被调用,在每一个请求上调用,返回None或HttpResponse对象;
服务器
(4)process_template_response(request,response):在视图恰好执行完后被调用,在每一个请求上调用,返回实现了render方法的响应对象;框架
(5)process_response(request,response):全部响应返回浏览器以前被调用,在每一个请求上调用,返回HttpResponse对象;ide
(6)process_exception(request,response,exception):当视图抛出异常时调用,在每一个请求上调用,返回一个HttpResponse对象。
下面显示各个方法在流程中的位置:
浏览器发起请求 --process-request()--》 匹配url成功 --prcess_view()--》运行view视图函数 --process_template_response()--》 调用html模板 --process_response()--》返回给浏览器。
第一次浏览器发起请求 --》_init_();
运行view视图函数时,出现异常 --》 process_exception --》 process_response --》返回浏览器。
下面演示中间件的配置使用,环境同上篇django文章。
在应用中定义一个python类,实现中间件:
]# cd py3/django-test1/test5 ]# vim bookshop/MyException.py
from django.http import HttpResponse class MyException(): def process_exception(request,response,exception): return HttpResponse(exception)
在settings.py配置文件中注册中间件:
]# vim test5/settings.py
MIDDLEWARE_CLASSES = ( 'bookshop.MyException.MyException', ... )
定义视图,验证中间件应用:
]# vim bookshop/views.py from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return render(request,'bookshop/index.html') def myExp(request): return HttpResponse('hello_world')
配置url:
]# vim bookshop/urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^$',views.index), url(r'^myexp$',views.myExp), ]
启动django服务:
]# cd py3/django-test1/test5 ]# python manage.py runserver 192.168.255.70:8000
浏览器访问:http://192.168.255.70:8000/myexp
显示:hello_world
在视图中,设置一个异常代码:
]# vim bookshop/views.py ... def myExp(request): a1 = int('abc') return HttpResponse('hello_world')
浏览器访问:http://192.168.255.70:8000/myexp
显示:invalid literal for int() with base 10: 'abc'