博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flask源代码阅读笔记(一)——应用启动
阅读量:7120 次
发布时间:2019-06-28

本文共 3049 字,大约阅读时间需要 10 分钟。

以前在博客园上写的文章,转到这里来。

这是一个最简单的demo:

from flask import Flaskapp = Flask(__name__)@app.route('/')def index():    return 'Hello, World!'if __name__ == '__main__':    app.run()

run()方法启动了应用,那么run()背后都调用哪些类、方法和函数呢?

将相关代码汇总起来,如下:

def run(self, host='localhost', port=5000, **options):        from werkzeug import run_simple        if 'debug' in options:            self.debug = options.pop('debug')        options.setdefault('use_reloader', self.debug)        options.setdefault('use_debugger', self.debug)        return run_simple(host, port, self, **options)def run_simple(hostname, port, application, use_reloader=False,               use_debugger=False, use_evalex=True,               extra_files=None, reloader_interval=1, threaded=False,               processes=1, request_handler=None, static_files=None,               passthrough_errors=False, ssl_context=None):    def inner():        make_server(hostname, port, application, threaded,                    processes, request_handler,                    passthrough_errors, ssl_context).serve_forever()def make_server(host, port, app=None, threaded=False, processes=1,                request_handler=None, passthrough_errors=False,                ssl_context=None):    if threaded and processes > 1:        raise ValueError("cannot have a multithreaded and "                         "multi process server.")    elif threaded:        return ThreadedWSGIServer(host, port, app, request_handler,                                  passthrough_errors, ssl_context)    elif processes > 1:        return ForkingWSGIServer(host, port, app, processes, request_handler,                                 passthrough_errors, ssl_context)    else:        return BaseWSGIServer(host, port, app, request_handler,                              passthrough_errors, ssl_context)class BaseWSGIServer(HTTPServer, object):    def __init__(self, host, port, app, handler=None,                 passthrough_errors=False, ssl_context=None):        if handler is None:            handler = WSGIRequestHandler        self.address_family = select_ip_version(host, port)        HTTPServer.__init__(self, (host, int(port)), handler)        self.app = app        self.passthrough_errors = passthrough_errors# BaseWSGIServer第四行class WSGIRequestHandler(BaseHTTPRequestHandler, object):    def run_wsgi(self):        app = self.server.app        environ = self.make_environ()        headers_set = []        headers_sent = []        def execute(app):            application_iter = app(environ, start_response)# 调用了__call__方法,所以要回到Flask类中寻找相关代码class Flask(object):    def __call__(self, environ, start_response):        return self.wsgi_app(environ, start_response)    def wsgi_app(self, environ, start_response):        with self.request_context(environ):            rv = self.preprocess_request()            if rv is None:                rv = self.dispatch_request()            response = self.make_response(rv)            response = self.process_response(response)            return response(environ, start_response)

使用graphviz将关系画出来,如下:

clipboard.png

转载地址:http://eubel.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
关于HashMap & HashTable谁快谁慢
查看>>
网页扁平化的设计
查看>>
B2B策划书:通过SWOT对B2B行业进行分析
查看>>
apache rewrite
查看>>
几个学习Maven不错的网址
查看>>
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
查看>>
Shell
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
RedHat配置yum源服务器
查看>>
我的友情链接
查看>>
detached entity passed to persist 错误的引起的原因和解决办法
查看>>
自动发送密码抓取远程日志 Shell脚本实现代码
查看>>
pyhon的语法缩进真叫一个蛋疼
查看>>
linux企业级应用
查看>>
禁止远程桌面到服务器复制粘贴
查看>>
CentOS7 安装MariaDB
查看>>
育贤网站开发问题总结
查看>>
我的友情链接
查看>>