IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 20220302 tornodo flask 生命周期 -> 正文阅读

[Python知识库]20220302 tornodo flask 生命周期

Django、Tornado、Flask优缺点_筑梦人-CSDN博客_tornado和flask

tornado异步原理(2)——高并发 - 马顿 - 博客园

Web后端学习笔记 Flask(11)Local线程隔离对象_开到荼蘼的博客-CSDN博客

Python - Django - 自定义一个中间件 - Sch01aR# - 博客园

WSGI到底是什么? - 知乎

django 生命周期






?

flask 生命周期    https://blog.csdn.net/qq_36019490/article/details/96359111


-请求上下文ctx:
    -request
    -session
-应用上下文:app_ctx:
    -g
    -current_app

-ctx=RequestContext(envion)
    -ctx对象中包装了一些东西:request对象,session

-LocalStack:自己定义的Local

_request_ctx_stack={'线程id':{'stack':[ctx,]}}

_app_ctx_stack={'线程id':{'stack':[app_ctx,]}}

-请求生命周期:
    -请求来了
    -生成ctx=里面放了request,和session
    -生成app_ctx=里面放了g,current_app
    -把他俩都放到全局变量中
    -放进session
    -执行before_request
    -执行视图函数
    -执行after_request
    -执行save_session
    -最终,不管是否报异常,都执行auto_pop(从全局变量中把ctx和app_ctx剔除)
    
-执行视图函数:
    -LocalProxy
    request.method

-g当次全局变量(只在当次请求有效)



请求上下文执行流程(ctx):
      -0 flask项目一启动,有6个全局变量
         -_request_ctx_stack:LocalStack对象
         -_app_ctx_stack :LocalStack对象
         -request : LocalProxy对象
         -session : LocalProxy对象
      -1 请求来了 app.__call__()---->内部执行:self.wsgi_app(environ, start_response)
      -2 wsgi_app()
         -2.1 执行:ctx = self.request_context(environ):返回一个RequestContext对象,并且封装了request(当次请求的request对象),session
         -2.2 执行: ctx.push():RequestContext对象的push方法
            -2.2.1 push方法中中间位置有:_request_ctx_stack.push(self),self是ctx对象
            -2.2.2 去_request_ctx_stack对象的类中找push方法(LocalStack中找push方法)
            -2.2.3 push方法源码:
                def push(self, obj):
                  #通过反射找self._local,在init实例化的时候生成的:self._local = Local()
                  #Local()flask封装的支持线程和协程的local对象
                  # 一开始取不到stack,返回None
                  rv = getattr(self._local, "stack", None)
                  if rv is None:
                     #走到这,self._local.stack=[],rv=[]
                     self._local.stack = rv = []
                  # 把ctx放到了列表中
                  #self._local={'线程id1':{'stack':[ctx,]},'线程id2':{'stack':[ctx,]},'线程id3':{'stack':[ctx,]}}
                  rv.append(obj)
                  return rv
      -3 如果在视图函数中使用request对象,比如:print(request)
         -3.1 会调用request对象的__str__方法,request类是:LocalProxy
         -3.2 LocalProxy中的__str__方法:lambda x: str(x._get_current_object())
            -3.2.1 内部执行self._get_current_object()
            -3.2.2 _get_current_object()方法的源码如下:```
                def _get_current_object(self):
                  if not hasattr(self.__local, "__release_local__"):
                     #self.__local()  在init的时候,实例化的,在init中:object.__setattr__(self, "_LocalProxy__local", local)
                     # 用了隐藏属性
                     #self.__local 实例化该类的时候传入的local(偏函数的内存地址:partial(_lookup_req_object, "request"))
                     #加括号返回,就会执行偏函数,也就是执行_lookup_req_object,不需要传参数了
                     #这个地方的返回值就是request对象(当此请求的request,没有乱)
                     return self.__local()
                  try:
                     return getattr(self.__local, self.__name__)
                  except AttributeError:
                     raise RuntimeError("no object bound to %s" % self.__name__)
                     ~
            -3.2.3 _lookup_req_object函数源码如下:
               def _lookup_req_object(name):
                  #name是'request'字符串
                  #top方法是把第二步中放入的ctx取出来,因为都在一个线程内,当前取到的就是当次请求的ctx对象
                  top = _request_ctx_stack.top
                  if top is None:
                     raise RuntimeError(_request_ctx_err_msg)
                  #通过反射,去ctx中把request对象返回
                  return getattr(top, name)
            -3.2.4 所以:print(request) 实质上是在打印当此请求的request对象的__str__
      -4 如果在视图函数中使用request对象,比如:print(request.method):实质上是取到当次请求的reuquest对象的method属性
      
-5 最终,请求结束执行: ctx.auto_pop(error),把ctx移除掉
      
其他的东西:
   -session:
      -请求来了opensession
         -ctx.push()---->也就是RequestContext类的push方法的最后的地方:
            if self.session is None:
               #self是ctx,ctx中有个app就是flask对象,   self.app.session_interface也就是它:SecureCookieSessionInterface()
               session_interface = self.app.session_interface
               self.session = session_interface.open_session(self.app, self.request)
               if self.session is None:
                  #经过上面还是None的话,生成了个空session
                  self.session = session_interface.make_null_session(self.app)
      -请求走了savesession
         -response = self.full_dispatch_request() 方法内部:执行了before_first_request,before_request,视图函数,after_request,savesession
         -self.full_dispatch_request()---->执行:self.finalize_request(rv)-----》self.process_response(response)----》最后:self.session_interface.save_session(self, ctx.session, response)
   -请求扩展相关
      before_first_request,before_request,after_request依次执行
   -flask有一个请求上下文,一个应用上下文
      -ctx:
         -是:RequestContext对象:封装了request和session
         -调用了:_request_ctx_stack.push(self)就是把:ctx放到了那个位置
      -app_ctx:
         -是:AppContext(self) 对象:封装了当前的app和g
         -调用 _app_ctx_stack.push(self) 就是把:app_ctx放到了那个位置
-g是个什么鬼?
   专门用来存储用户信息的g对象,g的全称的为global 
   g对象在一次请求中的所有的代码的地方,都是可以使用的 
   
   
-代理模式
   -request和session就是代理对象,用的就是代理模式

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:30:50  更:2022-03-04 15:32:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/31 4:00:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码