中间件:
调用
<span style="color: #0000ff;">def</span><span style="color: #000000;"> process_request(self,request):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">产生request对象之后,url匹配之前<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a></span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">pass</span>
<span style="color: #0000ff;">def</span> process_view(self,request,view_func,*view_args,**<span style="color: #000000;">view_kwargs):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">url匹配之后,视图<a href="/tag/hanshu/" target="_blank" class="keywords">函数</a><a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a>之前<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a></span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">pass</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> process_exception(self,exception):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">视图<a href="/tag/hanshu/" target="_blank" class="keywords">函数</a>发生异常时<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a></span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">pass</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> process_response(self,response):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">视图<a href="/tag/hanshu/" target="_blank" class="keywords">函数</a><a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a>之后,<a href="/tag/neirong/" target="_blank" class="keywords">内容</a>返回浏览器之前<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a></span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">return</span> response</pre>
正常调用顺序是从上往下,但如注册了多个中间件类中包含 process_exception函数的时候,process_exception函数调用的顺序跟注册的顺序是相反的,下面两张图说明:
流程图:
404ec08020d33c2218ddf63850.png" alt="">
注意:process_response之前的中间件如无返回,则默认返回 None,会继续执行下一个中间件,但如有返回,则直接跳到 process_response中间件
例子:
1.
在app内新建一个 middleware.py 文件
2.
django.http <span style="color: #0000ff;">class<span style="color: #000000;"> BlacklistIPSMiddleware(object):
<span style="color: #800000;">"""<span style="color: #800000;">中间件类<span style="color: #800000;">"""<span style="color: #000000;">
EXCLUDE_IPS = [<span style="color: #800000;">'<span style="color: #800000;">192.168.1.1<span style="color: #800000;">'<span style="color: #000000;">]
<span style="color: #800000;">"""<span style="color: #800000;">中间件类<span style="color: #800000;">"""<span style="color: #000000;">
EXCLUDE_IPS = [<span style="color: #800000;">'<span style="color: #800000;">192.168.1.1<span style="color: #800000;">'<span style="color: #000000;">]
</span><span style="color: #0000ff;">def</span> process_view(self,**<span style="color: #000000;">view_kwargs):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">视图<a href="/tag/hanshu/" target="_blank" class="keywords">函数</a><a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a>之前会<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a></span><span style="color: #800000;">"""</span><span style="color: #000000;">
user_ip </span>= request.<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>[<span style="color: #800000;">'</span><span style="color: #800000;">REMOTE_ADDR</span><span style="color: #800000;">'</span>] <span style="color: #008000;">#</span><span style="color: #008000;"> <a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>访问<a href="/tag/yonghu/" target="_blank" class="keywords">用户</a>的IP</span>
<span style="color: #0000ff;">if</span> user_ip <span style="color: #0000ff;">in</span><span style="color: #000000;"> BlacklistIPSMiddleware.EXCLUDE_IPS:
</span><span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">'</span><span style="color: #800000;">您在黑名单中</span><span style="color: #800000;">'</span>)</pre>
3.
# 'app名.中间件文件名.中间件类名'
MIDDLEWARE_CLASSES = (...,
...,
‘book.middleware.BlacklistIPSMiddleware’)