這篇在講解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)
基於以上的論點 參考下圖可以馬上了解整個流程
--> __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.
沒有留言:
張貼留言