一直想好好理一下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__才是处理请求真正开始的地方.
根据下面的提示,本身理一下吧.web