标签:else 添加 tor 包名 lob temp url 步骤 错误处理
因为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应用的启动过程:
from flask import Flask #导入Flask类 app = Flask(__name__) #1、实例化Flask app
flask.py文件:
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_‘]
)
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、request
self.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文件
功能就是完成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))
前面两个步骤,都是初始化操作,为后续启动做准备。包括初始化环境变量和路由添加。
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已经跑起来了。
标签:else 添加 tor 包名 lob temp url 步骤 错误处理
原文地址:https://www.cnblogs.com/skyflask/p/9194191.html