上次說到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,如需轉載請自行聯系原作者