一直想好好理一下flask的實現,這個項目有Flask 0.1版本源碼並加了註解,挺清晰明瞭的,我在其基礎上完成了對Werkzeug的理解部分,你們若是想深刻學習的話,能夠參考werkzeug_flow.md.python
爲了更容易理解Flask的實現原理,你須要對WSGI協議以及HTTP協議有一些瞭解,建議先簡單瀏覽下面的基本知識:git
Flask內部實現大量依賴於Werkzeug,包括請求和響應對象,路由匹配,URL生成等等,你能夠閱讀Werkzeug的文檔來深刻了解這些內容的具體實現。另外,若是你對模板渲染部分的內容感興趣,也能夠考慮閱讀Jinja2文檔:github
其實能夠參考簡化後web服務實現思路,socket創建後,監聽recv到的請求信息(no_wsgi_dome.no_wsgi.Socket._handle)並解析,而後調用相應的app.route對應的view_func.整個過程能夠大體分爲兩部分: 1. app-> werkzeug-> http-> socket 啓動端口監聽,註冊各類方法. 2. socket recv到請求-> 初始化RequestHandlerClass-> 調用Flask.__call__, wsgi_app在請求上下文中執行預處理方法,視圖方法,後響應方法等.
flask.Flask.run -> werkzeug.serving.run_simple -> werkzeug.serving.run_simple.inner ->werkzeug.serving.make_server -> BaseWSGIServer->HTTPServer.__init__(self, get_sockaddr(host, int(port),self.address_family), handler) -> BaseServer.__init__(self, server_address, RequestHandlerClass) -> werkzeug.serving.run_simple.inner.srv.serve_forever() -> socketserver.BaseServer.serve_forever 創建socket服務開始監聽,當ready也就是有recv到請求時開始 _handle_request_noblock
curl發出請求->socket接受到請求 -> SocketServer.BaseServer.serve_forever._handle_request_noblock -> SocketServer.BaseServer.process_request -> SocketServer.BaseServer.finish_request -> socketserver.BaseServer.__init__:self.RequestHandlerClass(request, client_address, self) -> 這裏要找出RequestHandlerClass是如何初始化的,它的真身是什麼 -> socketserver.TCPServer.__init__:BaseServer.__init__(self, server_address, RequestHandlerClass) -> http.server.HTTPServer(未重寫__init__) -> werkzeug.serving.BaseWSGIServer:HTTPServer.__init__(self, get_sockaddr(host, int(port),self.address_family), handler) (此處handler就是WSGIRequestHandler) -> RequestHandlerClass的真身已經找到,就是WSGIRequestHandler 也就是說每次請求來了都初始化一個WSGIRequestHandler去處理 -> 處理的入口應該是werkzeug.serving.WSGIRequestHandler.handle但是簡單一看並沒找到是如何開始處理請求的-> 往它的父類BaseHTTPRequestHandler中找也沒有 -> 再往上socketserver.StreamRequestHandler -> 找到了SocketServer.BaseRequestHandler.__init__:try:self.handle() 關鍵點 -> 開始調用子類WSGIRequestHandler中的handle方法 -> werkzeug.serving.WSGIRequestHandler (注意handler和handle_one_request,WSGIRequestHandler重載了BaseHTTPServer.BaseHTTPRequestHandler中的方法,BaseHTTPRequestHandler由重載了 SocketServer.BaseRequestHandler )-> werkzeug.serving.WSGIRequestHandler.handle_one_request調用werkzeug.serving.WSGIRequestHandler.run_wsgi 開始處理請求 -> run_wsgi.execute(self.server.app)將請求交予app來處理 -> flask.Flask.__call__ -> flask.Flask.wsgi_app 開始app內的流程,交由wsgi_app在請求上下文中執行預處理方法,視圖方法,後響應方法等。
BaseWSGIServer繼承了HTTPServer重寫了BaseServer.serve_forever(包了一層), HTTPServer繼承了TCPServer重寫了server_bind, TCPServer繼承了BaseServer重寫了server_bind, 主要思路要理清socket接受接請求後如何用請求觸發調用app,這裏主要是SocketServer.BaseRequestHandler.__init__:try:self.handle() 這個__init__纔是處理請求真正開始的地方.