博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
flask的上下文管理
阅读量:5882 次
发布时间:2019-06-19

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

请求到来时:

app是Flask对象
先执行app的call方法 -- wsgi_app方法
1、- wsgi_app方法会调用app的request_context方法,返回ctx
  返回RequestContext对象ctx,参数是app和environ,environ就是请求的所有内容
  - 1.1执行RequestContext的init方法
    封装ctx.app就是Flask对象,封装ctx.request就是Request对象,这里面就是请求的所有内容
    还有封装flash和session
2、- wsgi_app方法会继续调用ctx的push方法
  - 2.1执行RequestContext对象的push方法,参数是ctx
  - 2.2会先执行一些东西,但是没有讲,继而执行_request_ctx_stack的push方法,参数还是ctx
    _request_ctx_stack是LocalStack对象,执行LocalStack的push方法,参数还是ctx
    会给_request_ctx_stack对象的_local属性(local对象)封装stack属性值为空列表,将ctx追加进去
2.3执行Local对象的setattr方法(_request_ctx_stack._local),key就是线程或协程的唯一标识,value值是一个字典
  这个字典中的key就是stack,value值是带有ctx的列表,也就是给_request_ctx_stack._local属性值的__storage__属性添加键值对
3、- 最后执行ctx的auto_pop方法
  3.1执行RequestContext的auto_pop方法,会调用ctx的pop方法
    在ctx的pop方法中会调用_request_ctx_stack(localstack对象)的pop方法
    在localstack的pop方法中会找到stack属性对应的列表并删掉,也就是把当前线程或协程对应的RequestContext对象ctx删掉
请求到来之前:
0实例化LocalStack对象_request_ctx_stack
  0.1执行LocalStack的init方法
    封装_request_ctx_stack._local属性,属性值是Local对象
  0.2执行Local的init方法
    封装_request_ctx_stack._local.__storage__属性值是空字典
    封装_request_ctx_stack._local.__ident_func__属性值是线程或协程的唯一标识
    Local类就是专门来保存每个线程特有的值
1实例化LocalProxy对象request
  1.1执行LocalProxy的init方法
    封装_LocalProxy__local属性就是偏函数partial(_lookup_req_object, 'request')

 

视图中对request进行处理

打印request
1执行request的__str__方法
  1.1在LocalProxy的__str__方法中会调用request的_get_current_object方法
  1.2在这个方法中就会调用偏函数执行
  1.3偏函数中会调用_request_ctx_stack的top方法
    top方法就会获取stack属性值也就是列表,取索引-1,也就是当前线程或协程对应的RequestContext对象
    并且获取这个RequestContext对象的request属性值,也就是之前二次封装的Request对象,保存当前请求的所有内容

打印request.method

2执行request的getattr方法
  2.1在LocalProxy的getattr中,还是会调用equest的_get_current_object
  2.2调用偏函数
  2.3偏函数中会调用_request_ctx_stack的top方法,返回Request对象
    回到LocalProxy的getattr中获取这个Request对象的method属性值
  2.4去Request对象中找method属性值

 

 

 

 

转载于:https://www.cnblogs.com/wanghl1011/articles/8653697.html

你可能感兴趣的文章
基于express框架的应用程序骨架生成器介绍
查看>>
Spring学习11-Spring使用proxool连接池 管理数据源
查看>>
2016第6周五
查看>>
ASP.NET 免费开源控件
查看>>
面向对象葵花宝典阅读思维导图(二)
查看>>
volatile关键字与线程间通信
查看>>
优秀大数据GitHub项目一览
查看>>
WPF 窗体显示最前端
查看>>
tit.Atitit. http 代理原理 atiHttpProxy 大木马 h
查看>>
TCP/IP详解学习笔记(8)-DNS域名系统
查看>>
WPF 之 布局(一)
查看>>
Wireshark设置interface 时提示“There are no interfaces on which a capture can be done ”
查看>>
Android Studio使用SVN,与eclipse共同开发。
查看>>
iOS图片上传及压缩
查看>>
CentOS 7 ARM 版发布:支持树莓派2/香蕉派/CubieTruck
查看>>
Android Studio 编写 JNI
查看>>
nginx配置文件或目录404和403
查看>>
基于Bootstrap简单实用的tags标签插件
查看>>
ANDROID版本号和版本名称的重要性介绍
查看>>
DbContext运行时动态附加上一个dbset
查看>>