星期四, 6月 17, 2010

[Django] Middle Concept and Introduction

Django | Middleware | Django documentation

這篇在講解Django的Middleware的細節..... 終於有空開始看這些東西了 讀完之後 Summary如下.....

[Summary]

主要是Middleware會overwrite 幾個重要的funcitons...


1. process_request(self, request)

每一個http request都會進來, 還沒分派到view之前......... 是top-down的order來呼叫 (即第一個到最後一個)

可以選擇return None or return HttpResponse

如果是return None --> 繼續call 下一個middleware

如果return Reponse --> 停止call下一個......

2. process_view(self, request, view_func, view_args, view_kwargs)

分派好view之後,馬上call這個function........也是top-down order

可以選擇return None or return HttpResponse (同上 process_request, i.e. 不會續call if return Response)

3. process_response(self, request, response)

已經有HTTP Response......注意,這裡是bottom-up order

must return HttpResponse (alter or create new one)

Always會call下一個middleware....可以所以預期所有的middleware都會被call到這個function

4. process_exception(self, request, exception)

Process requets的時候在view throw exception......注意,這裡是bottom-up order

可以選擇return None or return HttpResponse (同上 process_request, i.e. 不會續call if return Response)


基於以上的論點 參考下圖可以馬上了解整個流程


Middleware application order.


--> __init__ of middleware

__init__不可以有參數,而且只會被call 一次 after web server starts up.

--> Runtime switch Django Middleware

可以在Middlewared的__init__ method raise django.core.exceptions.MiddlewareNotUsed exception
不過要restart web server.

這點我可以用到可以runtime configure setting, such as 開啟一個ProfilerMiddler, ...etc
在Web 界面可以更改到/etc/django.settings 然後再restart apache or web server
然後就可以configure 成另一個mode without code modification.

(雖然也可以直接改 django_project.settings.... 不過的確比較麻煩一點點....呵)


--> Django Default Support 的Middleware List

像是Cache middleware, GZIP middleware, Conditional GET middleware, Locale middleware, Message middleware, Session middleware, Authentication middleware, CSRF protection middleware, Transaction middlware.



沒有留言: