因为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_']
)

  

a、request_class变量是一个Request类,Request类继承自werkzeug的Request类。它调用了werkzeug的Request类的构造函数,RequestBase.__init__(self, environ)。然后又初始化了endpoint和view_args两个变量。

b、response_class变量是一个Response类。继承自werkzeug的Reponse类。且自己初始化了变量default_mimetype=‘text/html’。

c、static_path是静态文件路径,默认值为/static。

d、secret_key默认值为None。关于secret_key的作用,用官方的语言来解释:

If a secret key is set, cryptographic components can use this to sign cookies and other things. Set this to a complex random value when you want to use the secure cookie for instance.
如果设置了secret_key,加密组件使用这个key签名cookies。当你要使用安全cookie,你要把这个key设置成复杂的随机值。 This attribute can also be configured from the config with the SECRET_KEY configuration key. Defaults to None.
这个属性可以通过在配置文件中设置SECRET_KEY来设置。默值为None。

  

e、session_cookie_name,session的名字为session。

f、jinja_options选项初始化。

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、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文件

2.1 定义路由装饰器

功能就是完成url_map和view_functions的初始化,其中Rule是werkzeug提供的工具。

def route(self, rule, **options):   #route装饰器,装饰路由的同时,把路由添加进Map,添加视图函数,确保路由和视图函数映射起来
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已经跑起来了。

Flask学习-Flask app启动过程的更多相关文章

  1. wxWidgets源码分析(1) - App启动过程

    目录 APP启动过程 wxApp入口定义 wxApp实例化准备 wxApp的实例化 wxApp运行 总结 APP启动过程 本文主要介绍wxWidgets应用程序的启动过程,从app.cpp入手. wx ...

  2. Flask学习-Flask app接受第一个HTTP请求

    一.__call__() 在Flask app启动后,一旦uwsgi收到来自web server的请求,就会调用后端app,其实此时就是调用app的__call__(environ,start_res ...

  3. Flask学习-Flask基础之WSGI

    一.WSGI为什么会出现? 在学习一个东西之前,我们肯定想知道:它为什么会出现?那么,WSGI为什么会出现呢? 我们知道,部署一个web应用,经常需要使用nginx.apache或者IIS等web服务 ...

  4. [Flask]学习Flask第三天笔记总结

    from flask import Flask,render_template,request from others import checkLogin app = Flask(__name__) ...

  5. tiny4412学习之u-boot启动过程

    这个文档简要分析了tiny4412自带的u-boot的启动过程,这个u-boot启用了mmu,并且命令的接收和执行方式跟以前的不同. 文档下载地址: http://pan.baidu.com/s/1s ...

  6. Oracle学习笔记--Oracle启动过程归纳整理

    Oracle 启动过程分为nomount状态mount状态open状态 每个状态下Oracle都会进行不同的操作:1.nomount状态 在$ORACLE_HOME/dbs目录下寻找参数文件 参数文件 ...

  7. android app启动过程(转)

    Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...

  8. android app启动过程

    Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...

  9. 安卓 应用app启动过程

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 从用户点击 Launcher 上的 App 图标,到显示出 App 界面时主要发生的事情.知晓以 ...

随机推荐

  1. [原创]RedHat 安装MySQL数据库

    朋友购买了阿里云的服务器,服务器上自带有CentOS操作系统,但是开发软件需要自己安装,接下来将介绍本地RedHat Linux 5.10虚拟机上搭建Mysql数据库. 一.软件准备 (1)jdk-6 ...

  2. 转:检查c#代码内存泄露工具-CLR Profiler工具使用

    大家都知道.net有一套自己的内存(垃圾)回收机制,除非有一些数据(方法)长期占有内存不随着垃圾回收功能而释放内存,这样就造成了我们经常说的内存泄露.内存持续增长得不到释放等问题导致APS.NET网站 ...

  3. python基础学习8----文件基本操作

    一.文件的打开,open函数 f = open(file_name,mode)#创建文件对象 打开模式有很多种 1. 'r': 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. 2. ...

  4. angular、jquery、vue 的区别与联系

    angular和jquery的区别 angular中是尽量避免操作DOM, angular是基于数据驱动, 适合做数据操作比较繁琐的项目,angular适用于单页面开发,是一个比较完善的mvvm框架, ...

  5. easyui学习笔记14-拓展的基本验证规则

    /** * 扩展的基本校验规则, */ $.extend($.fn.validatebox.defaults.rules, { minLength : { // 判断最小长度 validator : ...

  6. eclipse能正常启动tomcat,但是网页访问不了

    参考网址https://blog.csdn.net/did_itmyway/article/details/62099930

  7. 一、git创建版本库及提交

    第一步:从Git官网直接   下载安装程序  ,并自行配置环境变量. git config --global user.name "Your Name" // 设置用户名 git ...

  8. Nowcoder 提高组练习赛-R3

    https://www.nowcoder.com/acm/contest/174#question 今天的题好难呀,只有94个人有分.然后我就爆零光荣 考到一半发现我们班要上物理课,还要去做物理实验( ...

  9. rename 表

    ----执行过程 TS.TEST ---RENAME INDEX(索引) ALTER INDEX TS.IDX1_TEST RENAME TO IDX1_TEST_BAK; ALTER INDEX T ...

  10. JDK1.8源码分析之HashMap

    一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也 ...