中间件 Middleware

中间件方法 
Initializer: __init__(self) 
出于性能的考虑,每个已启用的中间件在每个服务器进程中只初始化 一 次。也就是说 __init__() 仅在服务进程启动的时候调用,而在针对单个request处理时并不执行。 
对一个middleware而言,定义 __init__() 方法的通常原因是检查自身的必要性。如果 __init__() 抛出异常 django.core.exceptions.MiddlewareNotUsed ,则Django将从middleware栈中移出该middleware。 
在中间件中定义 __init__() 方法时,除了标准的 self 参数之外,不应定义任何其它参数。 

Request预处理函数: process_request(self, request) 
这个方法的调用时机在Django接收到request之后,但仍未解析URL以确定应当运行的view之前。Django向它传入相应的 HttpRequest 对象,以便在方法中修改。 
process_request() 应当返回 None 或 HttpResponse 对象. 
如果返回 None , Django将继续处理这个request,执行后续的中间件, 然后调用相应的view. 
如果返回 HttpResponse 对象, Django 将不再执行 任何 其它的中间件(而无视其种类)以及相应的view。 Django将立即返回该 HttpResponse . 

View预处理函数: process_view(self, request, view, args, kwargs) 
这个方法的调用时机在Django执行完request预处理函数并确定待执行的view之后,但在view函数实际执行之前。 
request HttpRequest 对象 . 
view Django将调用的处理request的python函数. 这是实际的函数对象本身, 而不是字符串表述的函数名。 
args 将传入view的位置参数列表,但不包括 request 参数(它通常是传入view的第一个参数) 
kwargs 将传入view的关键字参数字典. 
如同 process_request() , process_view() 应当返回 None 或 HttpResponse 对象。 
如果返回 None , Django将继续处理这个 request ,执行后续的中间件, 然后调用相应的view.luxi78@gmail.com 
如果返回 HttpResponse 对象, Django 将不再执行 任何 其它的中间件(不论种类)以及相应的view. Django将立即返回 

Response后处理函数: process_response(self, request, response) 
这个方法的调用时机在Django执行view函数并生成response之后。这里,该处理器就能修改response的内容;一个常见的用途是内容压缩,如gzip所请求的HTML页面。 
这个方法的参数相当直观: request 是request对象,而 response 则是从view中返回的response对象。 
process_response() 必须 返回 HttpResponse 对象. 这个response对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。 

Exception后处理函数: process_exception(self, request, exception) 
这个方法只有在request处理过程中出了问题并且view函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件, 或者甚至尝试从错误中自动恢复。 
这个函数的参数除了一贯的 request 对象之外,还包括view函数抛出的实际的异常对象 exception 。 
process_exception() 应当返回 None 或 HttpResponse 对象. 
如果返回 None , Django将用框架内置的异常处理机制继续处理相应request。 
如果返回 HttpResponse 对象, Django 将使用该response对象,而短路框架内置的异常处理机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值