Django 中间件 请求前

前端之家收集整理的这篇文章主要介绍了Django 中间件 请求前前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

中间件:

调用
<span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; process_request(self,request):
    </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt;产生request对象之后,url匹配之前<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a></span><span style="color: #800000;"&gt;"""</span>
    <span style="color: #0000ff;"&gt;pass</span>

<span style="color: #0000ff;"&gt;def</span> process_view(self,request,view_func,*view_args,**<span style="color: #000000;"&gt;view_kwargs):
    </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt;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;"&gt;"""</span>
    <span style="color: #0000ff;"&gt;pass</span>

<span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; process_exception(self,exception):
    </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt;视图<a href="/tag/hanshu/" target="_blank" class="keywords">函数</a>发生异常时<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a></span><span style="color: #800000;"&gt;"""</span>
    <span style="color: #0000ff;"&gt;pass</span>

<span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; process_response(self,response):
    </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt;视图<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;"&gt;"""</span>
    <span style="color: #0000ff;"&gt;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><span style="color: #0000ff;"&gt;def</span> process_view(self,**<span style="color: #000000;"&gt;view_kwargs):
    </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt;视图<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;"&gt;"""</span><span style="color: #000000;"&gt;
    user_ip </span>= request.<a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>[<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;REMOTE_ADDR</span><span style="color: #800000;"&gt;'</span>] <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; <a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>访问<a href="/tag/yonghu/" target="_blank" class="keywords">用户</a>的IP</span>
    <span style="color: #0000ff;"&gt;if</span> user_ip <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; BlacklistIPSMiddleware.EXCLUDE_IPS:
        </span><span style="color: #0000ff;"&gt;return</span> HttpResponse(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;您在黑名单中</span><span style="color: #800000;"&gt;'</span>)</pre>

3.

在settings配置文件注册中间件类

# 'app名.中间件文件名.中间件类名'

MIDDLEWARE_CLASSES = (...,

              ...,

             ‘book.middleware.BlacklistIPSMiddleware’)

猜你在找的Django相关文章