Django的中间件,我们可以在settings.py里看到,如下图所示:
想要激活中间件组件,将其添加到MIDDLEWARE_CLASSES里就可以了。
一、挂钩和应用程序顺序:
在请求阶段,在调用视图之前,Django按其定义的顺序MIDDLEWARE_CLASSES(自上而下)应用中间件。有两个挂钩:
process_request()
process_view()
在响应阶段,在调用视图后,中间件以相反的顺序从下向上应用。有三个挂钩:
process_exception() (仅当视图引发异常时)
process_template_response() (仅用于模板回复)
process_response()
二、编写自己的中间件
每个中间件组件都是一个Python类,它定义了以下一种或多种方法:
(1)process_request
process_request(request)
request是一个HttpRequest对象。process_request() 在Django决定执行哪个视图之前,会在每个请求上调用。
它应该返回一个None或一个HttpResponse 对象。如果它返回None,Django将继续处理此请求,执行任何其他process_request()中间件,然后是process_view() 中间件,最后是相应的视图。如果它返回一个 HttpResponse对象,Django将不会打扰任何其他请求,视图或异常中间件或适当的视图; 它会将响应中间件应用于此HttpResponse,并返回结果。
下面我们来举例:
**【1】**首先,在项目的同名文件下新建一个py文件,在这里叫做为mymiddleware.py文件,在此文件里定义一个类,如下所示:
class MyMiddleware(object):
def __init__(self):
print('这是我们自己写的中间件的init方法调用')
def process_request(self,request):
print('此时启用process_request')
然后将自己写的中间件添加到MIDDLEWARE_CLASSES里,如下所示:
最后在浏览器地址栏输入地址,运行成功以后,查看终端,可以看到如下图:
**【2】**若我们返回的是HttpResponse对象
from django.http import HttpResponse
class MyMiddleware(object):
def __init__(self):
print('这是我们自己写的中间件的init方法调用')
def process_request(self,request):
return HttpResponse('没有权限进行访问')
刷新页面后,可以看到页面上显示的是返回一个HttpResponse对象,如下图所示:
而且不管你地址栏输入任何一个地址,它都显示的是HttpResponse对象。
(2)process_view
process_view(request,view_func,view_args,view_kwargs)
request是一个HttpRequest对象。view_func是Django即将使用的Python函数。(它是实际的函数对象,而不是作为字符串的函数的名称。)view_args是将传递给视图的位置参数列表,并且view_kwargs是将传递给视图的关键字参数的字典。既不 view_args也不view_kwargs包括第一视图参数(request)。
process_view() 在Django调用视图之前调用。
它应该返回一个None或一个HttpResponse 对象。如果它返回None,Django将继续处理此请求,执行任何其他process_view()中间件,然后,相应的视图。如果它返回一个HttpResponse对象,Django将不会打扰调用任何其他视图或异常中间件或适当的视图; 它会将响应中间件应用于此 HttpResponse,并返回结果。
下面我们来举例:
在mymiddleware.py文件下写入如下代码:
class MyMiddleware(object):
def __init__(self):
print('这是我们自己写的中间件的init方法调用')
def process_request(self,request):
print('此时启用process_request')
# return HttpResponse('没有权限进行访问')
def process_view(self,request,view_func,view_args,view_kwargs):
print('此时启用process_view')
刷新页面后,查看终端,可以看到如下图:
若返回的是HttpResponse对象,和process_request的返回结果是一样的
(3)process_response
process_response(request,response)
request是一个HttpRequest对象。response是HttpResponse或 StreamingHttpResponse通过Django视图或通过一个中间件返回的对象。
process_response() 在所有响应返回浏览器之前调用它们。
它必须返回一个HttpResponse或 一个StreamingHttpResponse对象。它可以改变给定的 response,或者它可以创建并返回一个全新的 HttpResponse或 StreamingHttpResponse。
与process_request()和process_view()方法 不同process_response(),即使跳过相同中间件类的process_request()和process_view()方法(因为早期的中间件方法返回了HttpResponse),也总是调用该 方法 。特别是,这意味着您的 process_response()方法不能依赖于完成的设置 process_request()。
最后,请记住,在响应阶段,中间件以相反的顺序从下到上应用。这意味着MIDDLEWARE_CLASSES将首先运行在末尾定义的类。
下面我们来举例:
在mymiddleware.py文件下写入如下代码:
class MyMiddleware(object):
def __init__(self):
print('这是我们自己写的中间件的init方法调用')
def process_request(self,request):
print('此时启用process_request')
# return HttpResponse('没有权限进行访问')
def process_view(self,request,view_func,view_args,view_kwargs):
print('此时启用process_view')
def prcess_response(self,request,response):
print('调用process_response')
刷新页面,发现报错了,如下所示:
这是因为它必须返回一个它必须返回一个HttpResponse或 一个StreamingHttpResponse对象,否则就会报错。
接下来,我们让他返回一个response,代码如下所示:
class MyMiddleware(object):
def __init__(self):
print('这是我们自己写的中间件的init方法调用')
def process_request(self,request):
print('此时启用process_request')
# return HttpResponse('没有权限进行访问')
def process_view(self,request,view_func,view_args,view_kwargs):
print('此时启用process_view')
def process_response(self,request,response):
print('调用process_response')
print(response)
return response
重新刷新页面后,运行成功,可以发现response就是一个HttpResponse对象:
若是它直接返回一个HttpResponse对象,结果和前两个一样。
(4)process_exception
process_exception(request,exception)
request是一个HttpRequest对象。exception是Exception视图函数引发的 对象。
Django process_exception()在视图引发异常时调用。 process_exception()应该返回一个None或一个 HttpResponse对象。如果它返回一个 HttpResponse对象,将应用模板响应和响应中间件,并将结果响应返回给浏览器。否则,默认异常处理开始。
同样,中间件在响应阶段以相反的顺序运行,其中包括process_exception。如果异常中间件返回响应,则根本不会调用该中间件之上的中间件类。
下面我们来举例:
在mymiddleware.py文件下写入如下代码:
class MyMiddleware(object):
def init(self):
print(‘这是我们自己写的中间件的init方法调用’)
def process_request(self,request):
print('此时启用process_request')
# return HttpResponse('没有权限进行访问')
def process_view(self,request,view_func,view_args,view_kwargs):
print('此时启用process_view')
def process_response(self,request,response):
print('调用process_response')
print(response)
return response
def process_exception(self,request,exception):
print('异常处理')
在view.py文件里先抛出一个异常,如下所示:
def exceptions_test(request):
# 主动抛出异常,测试mymiddleware.py的process_exception中间件
raise Exception('异常')
刷新页面后,发现报错:
查看终端,如图所示:
以上就是中间件的简单介绍。