On The Way!

枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述Flask学习-Flask app启动过程相关的知识,希望能为你提供帮助。
因为0.1版本整体代码大概只有350行,比较简单。所以本篇文章会以Flask 0.1版本源码为基础进行剖析Flask应用的启动过程。
Flask参考资料flask,官网有一个最简单app:

from flask import Flask app = Flask(__name__)@app.route(‘/hello‘) def hello_world(): return ‘Hello World!‘if __name__ == ‘__main__‘: app.run(host=‘0.0.0.0‘, port=8080,debug=True)


下面就以上面这个最简单的Flask app为起点,以v0.1版本源码为核心进行说明整个Flask应用的启动过程:
一、初始化App
from flask import Flask#导入Flask类 app = Flask(__name__)#1、实例化Flask app


flask.py文件:
1.1、定义类变量
class Flask(object):‘‘‘ 全局变量 ‘‘‘ request_class = Request response_class = Response static_path = ‘/static‘ secret_key = None session_cookie_name = ‘session‘ jinja_options = dict( autoescape=True, extensions=[‘jinja2.ext.autoescape‘, ‘jinja2.ext.with_‘] )


1.2、初始化构造函数
def __init__(self, package_name): self.debug = False#debug变量为False self.package_name = package_name#一般为__name__,如果以本模块运行,则为__main__;如果是被调用,则为app文件名。 self.root_path = _get_package_path(self.package_name)#获取app的绝对路径 self.view_functions = {}#视图函数 self.error_handlers = {}#错误处理 self.before_request_funcs = []#HTTP请求之前需要执行的函数 self.after_request_funcs = []#HTTP请求结束之后,需要执行的函数 self.template_context_processors = [_default_template_ctx_processor]#上下文模板变量:session、g、requestself.url_map = Map()#url集合
if self.static_path is not None:#self.static_path默认值为‘/static‘,所以默认会把它加入到url_map集合中。Map([< Rule ‘/static/< filename> ‘ -> static> ]) self.url_map.add(Rule(self.static_path + ‘/< filename> ‘, build_only=True, endpoint=‘static‘)) if pkg_resources is not None: target = (self.package_name, ‘static‘) else: target = os.path.join(self.root_path, ‘static‘) self.wsgi_app = SharedDataMiddleware(self.wsgi_app, { self.static_path: target }) self.jinja_env = Environment(loader=self.create_jinja_loader(), **self.jinja_options) self.jinja_env.globals.update( url_for=url_for, get_flashed_messages=get_flashed_messages )


在构造函数中,主要定义了一些变量(debug、包名、包路径、视图函数、上下文相关、路由、static路径、模板相关环境)
 
二、路由处理
@app.route(‘/hello‘) def hello_world(): return ‘Hello World!‘


flask.py文件
2.1 定义路由装饰器【On The Way!】功能就是完成url_map和view_functions的初始化,其中Rule是werkzeug提供的工具。
def route(self, rule, **options): def decorator(f): self.add_url_rule(rule, f.__name__, **options)#Map([< Rule ‘/hello‘(HEAD,GET) -> hello_world> ]) self.view_functions[f.__name__] = f#view_functions = {‘hello_world‘:hello_world} return f return decorator
def add_url_rule(self, rule, endpoint, **options):options[‘endpoint‘] = endpoint options.setdefault(‘methods‘, (‘GET‘,)) self.url_map.add(Rule(rule, **options))


三、app.run()前面两个步骤,都是初始化操作,为后续启动做准备。包括初始化环境变量和路由添加。
if __name__ == ‘__main__‘: app.run(host=‘0.0.0.0‘, port=8080,debug=True)


app正式启动了。过程如下:
flask.run() --> werkzeug.run_simple() --> werkzeug.inner() --> werkzeug.serving.make_server() --> serve_forever() --> SocketServer.BaseServer.HTTPServer.serve_forever()#While True:****


  至此,一个flask的app已经跑起来了。

    推荐阅读