-
什么是中间件
是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能
Middleware is a framework of hooks into Django’s request/response processing.
It’s a light, low-level “plugin” system for globally altering Django’s input or output. -
Django内置中间件
-
django.middleware.security.SecurityMiddleware
做了一些安全处理的中间件。比如设置XSS防御的请求头,比如做了http协议转为https协议的工作等。
-
django.contrib.sessions.middleware.SessionMiddleware
session中间件。会给request添加一个处理好的session对象。
-
django.middleware.common.CommonMiddleware
通用中间件,会处理一些URL,比如baidu.com会自动的处理成www.baidu.com。比如/blog/111会处理成/blog/111/自动加上反斜杠。
-
django.middleware.csrf.CsrfViewMiddleware
保护中间件,在提交表单的时候会必须加入csrf_token,cookie中也会生成一个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF攻击。SessionMiddleware必须出现在CsrfMiddleware之前。
-
django.contrib.auth.middleware.AuthenticationMiddleware
用户授权中间件。会给request添加一个user对象的中间件。该中间件必须在sessionmiddleware后面。
-
django.contrib.messages.middleware.MessageMiddleware
消息处理中间件。为了在多个模板中可以使用我们返回给模板的变量,并且简化操作。
-
django.middleware.clickjacking.XFrameOptionsMiddleware
防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)攻击出现。
- 请求进来是自上而下,通过反射找到类,用for循环来执行,可以自定义中间件,但是也要写在MIDDLEWARE中,可以在app下创建一个mymid.py文件来写我们自定义的中间件
- 每一个中间件都有具体的功能
-
-
自定义中间件(process_request、process_response)
中间件可以定义五个方法,分别是:(主要的是process_request和process_response),在自己定义中间件时,必须继承MiddlewareMixin
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)
- 1
- 2
- 3
- 4
- 5
以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户,Django的生命周期图示很明显。
-
第一步:导入
from django.utils.deprecation import MiddlewareMixin
- 1
-
第二步:自定义中间件
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse
class Md1(MiddlewareMixin):
def process_request(self, request):
print("M1请求来时,效验")def process_response(self, request, response): print("M1返回数据时,对数据处理处理") return response
class Md2(MiddlewareMixin):
def process_request(self, request):
print("M2效验")
# return HttpResponse("Md2中断")def process_response(self, request, response): print("M2返回") return response
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
-
第三步:在view中定义一个视图函数(index)
def index(request): print("view函数...") return HttpResponse("OK")
- 1
- 2
- 3
-
第四步:在settings.py的MIDDLEWARE里注册自己定义的中间件
-
运行结果
-
process_request与process_response调用顺序
- 中间件的process_request方法是在执行视图函数之前执行的;当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的。
- 多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的
-
process_view
Django会在调用视图函数之前调用process_view方法。
- 表达式:
process_view(self, request, view_func, view_args, view_kwargs)
- request是HttpRequest对象。
- view_func是Django即将使用的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)。
- view_args是将传递给视图的位置参数的列表(无名分组分过来的值)
- view_kwargs是将传递给视图的关键字参数的字典(有名分组分过来的值)。view_args和view_kwargs都不包含第一个视图参数(request)。
它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。
- 表达式:
-
process_exception
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。
- 表达式:
process_exception(self, request, exception)
- request:HttpRequest对象
- exception:视图函数异常产生的Exception对象。
- 表达式:
-
process_template_response
该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法
from django.http import HttpResponse from django.shortcuts import render
Create your views here.
class Test:
def init(self, status, msg):
self.status = status
self.msg = msgdef render(self): import json dic = {'status': self.status, 'msg': self.msg} return HttpResponse(json.dumps(dic))
def index(request):
print("view函数...")
return Test(True, '测试')- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22