内容简介:Django的中间件事面向切面编程的实现,好比spring的过滤器和拦截器,他是request和response 处理过程的钩子。默认的setting.py中已经定义的中间件有。每一项都是一个中间件,就像电梯一样,从上到下,又从下到上一次经过每一个层楼(中间件)。
Django的中间件事面向切面编程的实现,好比spring的过滤器和拦截器,他是request和response 处理过程的钩子。
默认的setting.py中已经定义的中间件有。
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', ]
每一项都是一个中间件,就像电梯一样,从上到下,又从下到上一次经过每一个层楼(中间件)。
自定义中间件
自定义中间件只需要写一个普通的类即可。
# 可以写到任意py文件中,本例写在mysite/middlewares.py中 class MyMiddleware(object): def __init__(self, get_response): self.get_response = get_response def __call__(self, request): print('before') response = self.get_response(request) print('after') return response
然后setting.py中配置
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', 'mysite.middlewares.MyMiddleware', # 添加自定义中间件 ]
views.py和urls.py省略。简单的index视图。
启动服务器,输入 http://127.0.0.1:8000
将会在控制台看到
before after [26/Apr/2019 07:07:36] "GET / HTTP/1.1" 200 2
表示我们的中间件已经生效。
init初始化方法只在web服务启动时调用一次,get_response参数是必需的,这个参数指的是下一个中间件或者view函数(如果是最后一个中间件)。
每个请求都会调用一次 call ,先对请求做处理,然后将请求发往下一个中间件(get_response),一层层的迭代,就像栈一样,返回时对响应做处理。
如果其中一个层的中间件决定短路并返回响应而不调用其get_response,那么该层下面的层都不会看到请求或响应,只有该中间件和之上的中间件才会看到响应。
其他可用函数: process_view(request, view_func, view_args, view_kwargs):
在调用view之前被调用。
它应该返回一个None 或一个HttpResponse对象。 如果返回None,Django 将会继续处理这个请求,执行其它的process_view() 中间件,然后调用对应的视图。 如果它返回一个HttpResponse对象,也会起到短路作用
process_exception(request, exception):
当一个view引发异常时,Django会调用process_exception()来处理。返回一个None或一个HttpResponse对象。如果返回HttpResponse对象,会将响应交给处理响应的中间件处理。由于处理响应时是从下到上的,此层以上的process_exception()是不会被调用的。
process_template_response(request, response):
response参数应该是一个由view或者中间件返回的TemplateResponse对像(或等价的对象)。
如果响应的实例有render()方法,process_template_response()会在view刚好执行完毕之后被调用。这个方法必须返回一个实现了render方法的响应对象。
中间件就这么简单,通常重写call方法就行
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。