天天看点

编写一个中间件

上次说到django的中间件,这次就来写一个。这次就是通过中间件来做一个类似于日志的记录。

一、创建一个中间件目录与中间件文件

    中间件目录是Middle,log.py是中间件文件

<a href="https://s5.51cto.com/wyfs02/M02/99/91/wKioL1lJ3CKwBuMfAAANjSryovs678.png" target="_blank"></a>

现在来看看log.py文件:

也许写的比较low,就是想要记录一下访问项目的时间,ip,请求方式,请求url,返回的状态码。

<code>class</code> <code>Row1(MiddlewareMixin):</code>

<code>    </code><code>def</code> <code>process_request(</code><code>self</code><code>,request):</code>

<code>        </code><code>if</code> <code>request.META.has_key(</code><code>'HTTP_X_FORWARDED_FOR'</code><code>):</code>

<code>            </code><code>ip </code><code>=</code> <code>request.META[</code><code>'HTTP_X_FORWARDED_FOR'</code><code>]</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>ip </code><code>=</code> <code>request.META[</code><code>'REMOTE_ADDR'</code><code>]</code>

<code>        </code><code>u </code><code>=</code> <code>request.path_info</code>

<code>        </code><code>m </code><code>=</code> <code>request.method</code>

<code>        </code><code>subfolder </code><code>=</code> <code>time.strftime(</code><code>"%Y%m%d"</code><code>)</code>

<code>        </code><code>e </code><code>=</code> <code>str</code><code>(time.strftime(</code><code>'%Y-%m-%d %H:%M:%S'</code><code>,time.localtime(time.time())))</code>

<code>        </code><code>path </code><code>=</code> <code>str</code><code>(</code><code>'log/'</code> <code>+</code> <code>subfolder </code><code>+</code><code>'.log'</code><code>)</code>

<code>        </code><code>f </code><code>=</code> <code>open</code><code>(path,</code><code>'a+'</code><code>)</code>

<code>        </code><code>f.write( </code><code>'['</code><code>+</code><code>e </code><code>+</code> <code>']'</code><code>+</code><code>'\t'</code><code>+</code> <code>m </code><code>+</code> <code>'\t'</code><code>+</code> <code>u </code><code>+</code> <code>'\t'</code><code>+</code> <code>ip </code><code>+</code><code>'\t'</code><code>)</code>

<code>        </code><code>f.close()</code>

<code>    </code><code>def</code> <code>process_response(</code><code>self</code><code>,request,response):</code>

<code>        </code><code>path </code><code>=</code> <code>str</code><code>(</code><code>'log/'</code> <code>+</code> <code>subfolder </code><code>+</code> <code>'.log'</code><code>)</code>

<code>        </code><code>status </code><code>=</code> <code>str</code><code>(response.status_code)</code>

<code>        </code><code>f </code><code>=</code> <code>open</code><code>(path, </code><code>'a+'</code><code>)</code>

<code>        </code><code>f.write(status </code><code>+</code> <code>'\n'</code><code>)</code>

<code>        </code><code>return</code> <code>response</code>

当然,要创建这个log目录:

<a href="https://s1.51cto.com/wyfs02/M00/99/91/wKiom1lJ33XiPHZBAAAceR1PZkw913.png" target="_blank"></a>

二、将这个中间件加入到django里

    想要这个中间件生效,还需要在django的settings.py文件里加入这个中间件配置,在MIDDLEWARE里加入'Middle.log.Row1',

<a href="https://s4.51cto.com/wyfs02/M00/99/91/wKiom1lJ3h7Amm_9AAA7_iqkIsQ058.png" target="_blank"></a>

三、测试

访问网站,在log目录下就会生成以日期为命名的.log文件,文件内容为:

<a href="https://s4.51cto.com/wyfs02/M00/99/91/wKiom1lJ4BHgtCDuAABFwWmxXB0870.png" target="_blank"></a>

四、总结

通过上面,我们可以编写各种你需要的中间件,来更完善你的项目,同样也避免了在views.py文件里写过多的代码。比如访问限制、黑白名单等等。。

本文转自 sykmiao 51CTO博客,原文链接:http://blog.51cto.com/syklinux/1940457,如需转载请自行联系原作者