入口
由上一篇文章我们知道 Flask 要有如下函数或者一个实现了 __call__方法的类,才可以被wsgi server调用
1 | def application(environ, start_response): |
1 | class Applications(object): |
那 Flask是怎么做的呢? 我们来看一下简单的 Flask demo
1 | from flask import Flask |
这段代码很简单,先是创建了一个Flask实例(对象),然后调用Flask对象的route方法。
启动项目的时候调用Flask对象的run()方法
我们先不去看run方法内部是如何实现的,因为Flask内置了一个wsgi server,从 run方法进入会涉及到很多 wsgi server 的代码,而生产环境我们一般不用这个 wsgi server,而是用gunicorn或者uwsgi。
在 pycharm中按 ctrl,鼠标左键点击 Flask查看源码
我们可以看到Flask是一个类,那么他一定实现 __call__方法

点击 pycharm左侧的 structure我们可以看到果然有 __call__方法,而且这个 __call__方法的参数是 environ,start_response,wsgi server最后调用的也是这个方法

我们进入到这个方法,随便打个断点
启动项目
接下来我们以 debug的方式启动项目

浏览器访问 http://127.0.0.1:5000/,我们看到 pycharm在 我们的断点处停了下来,__call__方法又调用了wsgi_app方法,参数都一摸一样

再看 wsgi_app方法
1 | def wsgi_app(self, environ, start_response): |
这个方法其实就做了以下几件事
- 路由:就是根据你的请求,找到对应的视图函数。例如我们的请求
http://127.0.0.1:5000/会被@flask_app.route('/')匹配到,那么就会调用hello_world方法 - 处理请求上下文和应用上下文
- 错误处理
- 回调
wsgi server提供的start_response方法把结果返回给wsgi server
接下来分别介绍这几个部分