1.什么是中间件
中间件,就是在请求和处理请求中间所做的一些操作。在django中有request中间件,view中间件,response中间件,exception中间件等等。Midddleware都需要在settings.py中的MIDDLEWARE_CLASSES中进行定义。大致的流程如下:
当一个请求来的时候,会将setting.py中的MIDDLERWARE_CLASSES中的中间件类名全部从头到尾的执行一遍。对于每个中间件类名里面都会有多个中间件的处理方法,如一个中间件类名MD1中有process_request方法,这是request中间件,process_response这是response中间件,process_view中间件,这是view中间件等等。
2.中间件实例
下面这个文件需要在一个app下面的一个文件中,如middlerware.py中
# 导入中间件模块
from django.utils.deprecation import MiddlewareMixin
# 这是一个中间件的类名,需要在settings.py文件的MIDDLEWARE_CLASSES中引入这个类名
class MD1(MiddlewareMixin):
# 接收到客户端信息后立即执行(视图函数之前)
def process_request(self, request):
print("MD1里面的 process_request")
# 返回到客户端信息前最后执行(视图函数之后)
def process_view(self, request, view_func, view_args, view_kwargs):
print("MD1里面的 process_view")
return None
# 返回到客户端信息前最后执行(视图函数之后)
def process_response(self, request, response):
print("MD1里面的 process_response")
return response
在settings中定义
MIDDLEWARE = [
# 自定义 在 对应app内创建一个 my_middleware.py 然后路径填写进来即可
'app01.middlerware.MD1',
]
如上定义以后,当任意一个请求requst来了以后都会立刻去执行MD1这个中间件类,然后顺序的去执行里面的process_request方法和process_view方法和process_response方法;
在这些方法中除process_response均可以返回None或者response,若返回None则继续处理这个request,执行后续的中间件。若返回response则Django不再执行任何其他中间件,立即返回该HttpResponse;
process_response方法必须返回HttpResponse 对象;这个response对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。
3.各中间件参数介绍
3.1 Request预处理函数: process_request(self, request)
这个方法的调用时机在Django接收到request之后,但仍未解析URL以确定应当运行的view之前。Django向它传入相应的 HttpRequest 对象,以便在方法中修改。
process_request() 应当返回 None 或 HttpResponse 对象.
如果返回 None , Django将继续处理这个request,执行后续的中间件, 然后调用相应的view.
如果返回 HttpResponse 对象,Django 将不再执行任何其它的中间件(无视其种类)以及相应的view。 Django将立即返回该 HttpResponse .
3.2 View预处理函数: process_view(self, request, callback, callback_args, callback_kwargs)
这个方法的调用时机在Django执行完request预处理函数并确定待执行的view之后,但在view函数实际执行之前。
request
HttpRequest 对象。
callback
Django将调用的处理request的python函数. 这是实际的函数对象本身, 而不是字符串表述的函数名。
args
将传入view的位置参数列表,但不包括 request 参数(它通常是传入view的第一个参数)
kwargs
将传入view的关键字参数字典.
如同 process_request() , process_view() 应当返回 None 或 HttpResponse 对象。
如果返回 None , Django将继续处理这个 request ,执行后续的中间件, 然后调用相应的view
如果返回 HttpResponse 对象,Django 将不再执行 任何 其它的中间件(不论种类)以及相应的view。Django将立即返回
3.3Response后处理函数: process_response(self, request, response)
这个方法的调用时机在Django执行view函数并生成response之后。
该处理器能修改response的内容;一个常见的用途是内容压缩,如gzip所请求的HTML页面。
这个方法的参数相当直观: request 是request对象,而 response 则是从view中返回的response对象。
process_response() 必须 返回 HttpResponse 对象. 这个response对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。
3.4Exception后处理函数: process_exception(self, request, exception)
这个方法只有在request处理过程中出了问题并且view函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件, 或者甚至尝试从错误中自动恢复。
这个函数的参数除了一贯的 request 对象之外,还包括view函数抛出的实际的异常对象 exception 。
process_exception() 应当返回 None 或 HttpResponse 对象.
如果返回 None , Django将用框架内置的异常处理机制继续处理相应request。
如果返回 HttpResponse 对象, Django 将使用该response对象,而短路框架内置的异常处理机制
来源地址:http://www.crazyant.net/1001.html