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_']
)
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启动过程的更多相关文章
- wxWidgets源码分析(1) - App启动过程
目录 APP启动过程 wxApp入口定义 wxApp实例化准备 wxApp的实例化 wxApp运行 总结 APP启动过程 本文主要介绍wxWidgets应用程序的启动过程,从app.cpp入手. wx ...
- Flask学习-Flask app接受第一个HTTP请求
一.__call__() 在Flask app启动后,一旦uwsgi收到来自web server的请求,就会调用后端app,其实此时就是调用app的__call__(environ,start_res ...
- Flask学习-Flask基础之WSGI
一.WSGI为什么会出现? 在学习一个东西之前,我们肯定想知道:它为什么会出现?那么,WSGI为什么会出现呢? 我们知道,部署一个web应用,经常需要使用nginx.apache或者IIS等web服务 ...
- [Flask]学习Flask第三天笔记总结
from flask import Flask,render_template,request from others import checkLogin app = Flask(__name__) ...
- tiny4412学习之u-boot启动过程
这个文档简要分析了tiny4412自带的u-boot的启动过程,这个u-boot启用了mmu,并且命令的接收和执行方式跟以前的不同. 文档下载地址: http://pan.baidu.com/s/1s ...
- Oracle学习笔记--Oracle启动过程归纳整理
Oracle 启动过程分为nomount状态mount状态open状态 每个状态下Oracle都会进行不同的操作:1.nomount状态 在$ORACLE_HOME/dbs目录下寻找参数文件 参数文件 ...
- android app启动过程(转)
Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...
- android app启动过程
Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...
- 安卓 应用app启动过程
韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 从用户点击 Launcher 上的 App 图标,到显示出 App 界面时主要发生的事情.知晓以 ...
随机推荐
- Node.js+Ajax实现物流小工具
半年过去了,好像什么也没干,好像什么也干了. 最近在网易云课堂上看到了这个课程,觉得很有意思,就跟着课程做了一遍,课程地址:http://study.163.com/course/courseMain ...
- SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组
SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组 之前写过一篇文章:SQLSERVER将一个文件组的数据移动到另一个文件组 每个物理文件(数据文件)对应一个文件组的情况(一对一) 如 ...
- Python学习--Selenium模块学习(2)
Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...
- 【转】HTTP学习---Web 缓存
[原文]https://www.toutiao.com/i6592743068623962632/ 1. 前端缓存概述 前端缓存主要是分为HTTP缓存和浏览器缓存.其中HTTP缓存是在HTTP请求传输 ...
- git常用命令合集(持续完善)
git常用命令合集(持续更新,仅为便于查阅) 上传整个项目 git init git add 项目名 git commit -m "提交的注释信息" 若已经绑定远程仓库,则直接:g ...
- java将Excel文件上传并解析为List数组
前端 //导入excel文件 layui.use('upload', function() { var upload =layui.upload; //指定允许上传的文件类型 var uploadIn ...
- 3.Solr4.10.3目录结构
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.整个目录结构 (1)bin:是脚本的启动目录 (2)contrib:第三方包存放的目录 (3)dist:编 ...
- C#实现的协同过滤算法
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace SlopeOn ...
- 容器内部设置JVM的Heap大小
容器内部利用脚本来获取容器的CGroup资源限制,并通过设置JVM的Heap大小. Docker1.7开始将容器cgroup信息挂载到容器中,所以应用可以从 /sys/fs/cgroup/memory ...
- Postman-常用方法集合
postman常用方法集合: 1.设置环境变量 postman.setEnvironmentVariable("key", "value"); pm.envir ...