在此之前需要先知道类和方法,个人总结如下:

 1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法
 2.类是type创建,创建类时候type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)

# 第0步: 执行type的 __init__ 方法【类是type的对象】
class Foo:
    def __init__(self):
        pass

def __call__(self, *args, **kwargs):
        pass

第1步: 执行type的 __call__ 方法
       1.1  调用 Foo类(是type的对象)的 __new__方法,用于创建对象。
       1.2  调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。
obj = Foo()
# 第2步:执行Foodef __call__ 方法
obj()

再来我们以下面例子作为参考

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello World!' if __name__ == '__main__':
app.run()

1,首先执行Flask类的__call__方法:

class RequestContext(object):
def __init__(self,environ):
self.environ = environ def push(self):
# 3
# 请求相关数据,加到local中: stack.push...
_request_ctx_stack.push(self) # 获取cookie中的随机字符串,检验是否有,没有就生成
# 根据随机字符串,获取服务端保存的session的
# {
# 'xxxxxxx': {...}
# 'xxxxxxx': {...}
# }
# 新用户: {}
# 老用户:{user:'xxx'}
self.session = self.app.open_session(self.request)
if self.session is None:
self.session = self.app.make_null_session() class Flask:
def process_response(self, response):
# 8
# 执行 after_request装饰器
for handler in funcs:
response = handler(response) # 将内存中的session持久化到:数据库、....
if not self.session_interface.is_null_session(ctx.session):
self.save_session(ctx.session, response) return response def finalize_request(self, rv, from_error_handler=False):
# 7
response = self.make_response(rv)
try:
response = self.process_response(response)
request_finished.send(self, response=response)
except Exception:
if not from_error_handler:
raise
self.logger.exception('Request finalizing failed with an '
'error while handling an error')
return response def full_dispatch_request(self):
# 5 # 触发只执行一次的装饰器函数,@before_first_request
self.try_trigger_before_first_request_functions()
try:
# 触发Flask的信号,没用: pip3 install blinker
request_started.send(self) # 执行特殊装饰器:before_request
# 如果没有返回值,rv=None;有返回值 “嘻嘻嘻”
rv = self.preprocess_request()
if rv is None:
# 触发执行视图函数
rv = self.dispatch_request()
except Exception as e:
rv = self.handle_user_exception(e) # 6 对返回值进行封装
return self.finalize_request(rv) def wsgi_app(self, environ, start_response): # 处理request,将请求添加到local中
ctx = self.request_context(environ)
# 2.处理request和session
ctx.push() error = None
try:
try:
# 4 执行视图函数
response = self.full_dispatch_request()
except Exception as e:
error = e
response = self.handle_exception(e)
except:
error = sys.exc_info()[1]
raise
return response(environ, start_response)
finally:
if self.should_ignore_error(error):
error = None
# 9
ctx.auto_pop(error) def __call__(self, environ, start_response):
"""Shortcut for :attr:`wsgi_app`."""
return self.wsgi_app(environ, start_response)

1,执行Flask的__call__方法

2,wsgi_app(request_context(environ),push) 对request和session的处理,第一次进来session为None,进行push

3,请求相关数据,加到local中: stack.push。获取cookie中的随机字符串,检验是否有,没有就生成根据随机字符串,获取服务端保存的session的

4,执行视图函数    full_dispatch_request()

5,触发只执行一次的装饰器函数,@before_first_request  > ( 触发Flask的信号,没用: pip3 install blinker) >  执行特殊装饰器:before_request 如果没有返回值,rv=None;有返回值 ,rv="  返回值  "

6 ,  对返回值进行封装    return self.finalize_request(rv)

7 ,  对封装的数据进行处理,并返回 response

8 , 执行 process_response(self, response):     执行 after_request装饰器   将内存中的session持久化到:数据库、redis、 ....

9 , 最后返回数据,并进行  ctx.auto_pop(error)

Flask源码流程剖析的更多相关文章

  1. Flask源码流程分析(一)

    Flask源码流程分析: 1.项目启动: 1.实例化Flask对象 1. 重要的加载项: * url_rule_class = Rule * url_map_class = Map * session ...

  2. Flask 源码流程,上下文管理

    源码流程 创建对象 from flask import Flask """ 1 实例化对象 app """ app = Flask(__na ...

  3. 07 flask源码剖析之用户请求过来流程

    07 Flask源码之:用户请求过来流程 目录 07 Flask源码之:用户请求过来流程 1.创建ctx = RequestContext对象 2. 创建app_ctx = AppContext对象 ...

  4. flask源码剖析系列(系列目录)

    flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...

  5. 08 Flask源码剖析之flask拓展点

    08 Flask源码剖析之flask拓展点 1. 信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 2. 根据flas ...

  6. flask 源码剖析

    flask 上下文管理源码流程及涉及的部分技术点 [flask源码梳理]之一  偏函数_mro [flask源码梳理]之二  面向对象中__setattr__ [flask源码梳理]之三  Local ...

  7. Python Web Flask源码解读(一)——启动流程

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  8. 01 flask源码剖析之werkzurg 了解wsgi

    01 werkzurg了解wsgi 目录 01 werkzurg了解wsgi 1. wsgi 2. flask之werkzurg源码流程 3. 总结 1. wsgi django和flask内部都没有 ...

  9. Flask源码剖析详解

    1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析flask的实现,试图理清flask中的一些概念,加深读者对flask的理解,提高对flask的认识.从而 ...

随机推荐

  1. SpringCloud四:hystrix-propagation

    注:pom.xml 及配置文件配置与上篇相同 package com.itmuch.cloud.controller; import org.springframework.beans.factory ...

  2. Bootstrap学习笔记(二)---常见工具和流程导航范例

    使用bootstrap框架避免不了写CSS,当CSS文件较大时,会发现维护起来很麻烦,一些默认值,如行高.背景色.标注颜色.字号等信息往往反复出现,还有一些大体上一致,只有小部分不同的样式定义,这就需 ...

  3. iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...

  4. 【python】列表

    >>> mix = [2,3.4,"abc",'中国',True,['ab',23]]>>> mix[2, 3.4, 'abc', '中国', ...

  5. 云计算之路-阿里云上-2017年最错误的选择: 生产环境使用 docker swarm

    2017年12月29日 10:18 ~ 11:00 左右,由于整个 docker swarm 集群宕机,造成我们迁移至 .net core 跑在 docker swram 上的所有站点无法正常访问,由 ...

  6. phpexcel导出成绩表

    效果图如下: 代码如下:代码注释不全,请大家参考phpexcel中文帮助手册 <?php require_once 'PHPExcel.php'; function bfb($n) { retu ...

  7. 设计模式之 - 模板模式(Template Pattern)

    引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplica ...

  8. Macaca环境配置及样例执行

    1.Macaca简介 macaca是由阿里巴巴公司开发的一套自动化解决方案,适用于PC端和移动端.Macaca基于Node.js开发,测试案例编写语言暂时也只支持Node.js. 2.Macaca与A ...

  9. Linux目录结构详解

    /: 根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中/bin:/usr/bin: 可执行二进制文件的目录,如常用的命令ls ...

  10. windows 下的python 安装pycrypto

    一般在官方网站下载pycrypto: https://www.dlitz.net/software/pycrypto/   然后使用命令就可以安装成功了: python setup.py build  ...