博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flask学习-Flask app启动过程
阅读量:5062 次
发布时间:2019-06-12

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

因为0.1版本整体代码大概只有350行,比较简单。所以本篇文章会以Flask 0.1版本源码为基础进行剖析Flask应用的启动过程。

Flask参考资料,官网有一个最简单app:

from flask import Flaskapp = 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([
' -> static>]) self.url_map.add(Rule(self.static_path + '/
', 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([
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已经跑起来了。

转载于:https://www.cnblogs.com/skyflask/p/9194191.html

你可能感兴趣的文章
存储开头结尾使用begin tran,rollback tran作用?
查看>>
Activity启动过程中获取组件宽高的五种方式
查看>>
java导出Excel表格简单的方法
查看>>
SQLite数据库简介
查看>>
利用堆实现堆排序&优先队列
查看>>
Mono源码学习笔记:Console类(四)
查看>>
Android学习路线(十二)Activity生命周期——启动一个Activity
查看>>
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
windows下编译FreeSwitch
查看>>
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
App.config自定义节点读取
查看>>
unity3d根据手机串号和二维码做正版验证
查看>>
二十六、Android WebView缓存
查看>>
django Models 常用的字段和参数
查看>>
linux -- 嵌入式linux下wifi无线网卡驱动
查看>>
SVN使用教程总结
查看>>
SQL中varchar和nvarchar有什么区别?
查看>>