十一.Django的中间件(MiddleWare)
1.什么是中间件
Django中间件(Middleware)是一个轻量级、底层的“插件”系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件:如下
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',
]
- class SecurityMiddleware -->为请求/响应循环提供了几种安全改进
- class SessionMiddleware -->开启会话支持
- class CommonMiddleware -->基于APPEND_SLASH和PREPEND_WWW的设置来重写URL
如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL
如果PREPEND_WWW设为True,前面缺少 "www."的url将会被重定向到相同但是以一个"www."开头的url
- class CsrfViewMiddleware -->添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值
- class AuthenticationMiddleware -->向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户
- class MessageMiddleware -->开启基于Cookie和会话的消息支持
- class XFrameOptionsMiddleware -->对点击劫持的保护
2.中间件的运行顺序
MIDDLEWARE中的顺序很重要,因为中间件可以依赖于其他中间件
在请求阶段,在调用视图之前,Django以MIDDLEWARE(自上而下,从左自右)定义的顺序应用中间件
在处理响应期间,中间件的执行顺序是倒序执行的
2.1 在中间件中的5种方法
中间件中可以定义5个方法,分别是:
1. process_request(self,request) :
执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
返回值是None的话,按正常流程继续走,交给下一个中间件处理或路由系统处理;如果是HttpResponse对象,Django将不执行视图函数,而该HttpResponse对象会经过本层process_response返回给浏览器
2. process_view(self, request, callback, callback_args, callback_kwargs):
在Django调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
如果返回None,Django 将会继续处理这个请求,执行其它的process_view() 中间件,然后调用对应的视图。 如果它返回一个HttpResponse对象,Django不会调用相应的视图;HttpResponse会经由本层及本层外层的响应中间件返回给浏览器
3. process_template_response(self,request,response):
在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
这个方法必须返回一个实现了render方法的响应对象
4. process_exception(self, request, exception)
当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
process_exception()应该返回一个 None 或者一个HttpResponse对象。 如果它返回一个HttpResponse对象,则将应用模板响应和响应中间件,并将生成的响应返回给浏览器。 否则,默认的异常处理开始工作。
5. process_response(self, request, response)
所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
3.自定义中间件
3.1自定义中间件的例子
1.在主目录下创建了一个e.py的文件.
2.在.py的文件中创建一个MyException的类
3.自定义时你想要加在哪一块加功能就定义相对于的方法,不用全部都定义
3.2 自定义中间件的例子2
1.在.py的文件中创建一个UserMiddleware的类
2.这个例子是给request请求增加一个myuser的属性.
3.以这一句为分界,分别在view之前执行和view之后执行
3.3 进行中间件注册(对例子)
mysite是项目名,先找到文件所在的位置,把自定义的中间件的类添加到MIDLEWARE的列表当中.
4.Django的工作流程