(搬运以学习)flask 上下文的实现

引言

本文主要梳理了flask的current_app, request, session, g的实现原理

源码说明

本文使用flask 0.5 版本

application context 和request context

flask有两个context: application contextrequest context

这里需要通俗地解释一下application contextrequest context

  1. application 指的就是当你调用app = Flask(__name__)创建的这个对象app
  2. request 指的是每次http请求发生时,WSGI server(比如gunicorn)调用Flask.__call__()之后,在Flask对象内部创建的Request对象;
  3. application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;
  4. application的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request

下面通过源码了解一下 flask 如何实现这两种context:

# 代码摘选自flask 0.5 中的ctx.py文件, 进行了部分删减
class _RequestContext(object):

    def __init__(self, app, environ):
        self.app = app
        self.request = app.request_class(environ)
        self.session = app.open_session(self.request)
        self.g = _RequestGlobals()

flask 使用_RequestContext的代码如下:

class Flask(object):

    def request_context(self, environ):
        return _RequestContext(self, environ)  

  在Flask类中,每次请求都会调用这个request_context函数。这个函数则会创建一个_RequestContext对象。

值得注意的是:这个对象在创建时,将Flask实例的本身作为实参传入_RequestContext自身,因此,
self.app = Flask()

所以,虽然每次http请求都会创建一个_RequestContext对象,但是,每次创建的时候都会将同一个Flask对象传入该对象的app成员变量,使得:

由同一个Flask对象响应的请求所创建的_RequestContext对象的app成员变量都共享同一个application

  

通过在Flask对象中创建_RequestContext对象,并将Flask自身作为参数传入_RequestContext对象的方式,实现了多个request context对应一个application context 的目的。

接下来,看self.request = app.request_class(environ)这句。
由于app成员变量就是app = Flask(__name__)这个对象,所以,app.request_class就是Flask.request_class
Flask类的定义中:

request_class = Request # Request 是一个类,定义如下:

class Request(RequestBase):
    ... 

所以:
self.request = app.request_class(environ)实际上是创建了一个Request对象。
由于,一个http请求对应一个_RequestContext对象的创建,而每个_RequestContext对象的创建对应一个Request对象的创建,所以,每个http请求对应一个Request对象。

到这里想必已经很清楚了:

application 就是指app = Flask(__name__)对象
request 就是对应每次http 请求创建的Request对象
flask通过_RequestContextappRequest关联起来

总结

    1. app = Flask(__name__)创建了application, 这个application对应的上下文,就是application context
    2. Flask每响应一个http请求,就会创建一个Request对象,这个request对象对应的上下文,就是request context

原文地址:https://www.cnblogs.com/wf-skylark/p/9218879.html

时间: 2024-11-09 06:06:23

(搬运以学习)flask 上下文的实现的相关文章

怎样学习flask

怎样彻底学习Flask框架?怎样学习顺序比较合理? web框架需要快速入门 ? Web框架是一组工具的集合, 为你的Web应用开发提供了基础环境, 从如何获取参数,到如何返回结果, 从如何获取cookie到如何修改返回的http header.Web框架帮你隐藏了HTTP协议的细节, 你作为一个使用者只需要关心如何实现功能,而不需要底层到底实现的是什么. Web框架很多, 不同的语言都有自己实现的不同的Web框架. 每一种都有各自不同的实现思路, 有不同的开发哲学, 不管是就换工作换开发栈的需要

python web服务学习——flask

flask是一个使用 Python 编写的轻量级 Web 应用框架.也是开发python web服务最常用的框架之一. 第一步当然是安装flask,依然是pip安装: 学习flask可以从官网的quick start(http://flask.pocoo.org/docs/0.10/quickstart/#hooking-in-wsgi-middlewares)开始,这里有许多的小例子,先看一个最简单的 from flask import Flask app = Flask(__name__)

python深入学习02 上下文管理器

上下文管理器(context manager)主要用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它的语法形式是with...as... 关闭文件 上下文管理器有个特别好的优点:可以在不使用文件的时候,自动关闭文件,节省了f.close()的步骤 上下文管理器有隶属于它的程序块.当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件 (我们通过f.closed来查询文件是否关闭).我们相当于使用缩进规定了文件对象f的

Flask上下文管理、session原理和全局g对象

一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能,这三个数中,其中一个数必须是3 # 我们就可以使用偏函数来帮着我们传参 from functools import partial # partial:给add这个函数固定传一个数字 3 new_add = partial(add, 3) # 因此新的函数只需要传2个参数 new_add(1,1)

在使用Flask的APScheduler时,如何优雅的导入flask上下文

配置任务JOBS class JobConfig: JOBS = [ { 'id': 'example', 'func': 'job_func', 'args': (), 'trigger': 'interval', 'seconds': 10 } ] 上述代码中几个参数: id:自定义ID func:即你要定时执行的函数,书写规则是 '目录 : 函数名',从config文件所在的目录算起 args:要传入的参数 trigger:任务类型,或者理解为定时器开启的方式,有三种:date表示具体的一

深入学习Flask框架之视图及路由

在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的Python函数库.WSGI协议在前面的文章中也有提到(点我查看).那Werkzeug有什么作用呢?它其实实现了很多底层的东西,如Request.Response和集成URL请求路由等. 一.Werkzeug的组成: 二.routing模块 routing模块的主要目的是负责实现URL解析.不同的UR

Flask 上下文管理-- (session,request,current_app的传递)

Flask session,request,current_app的传递 1 flask的 request, session 和 current_app 都是 设置方式比较新颖 -- 通过上下文管理的方式实现的 每次请求进来app.run调用 call 方法, 创建 一个本地线程(唯一标识作为键) -- 然后把实例化的对象push到一个地方,在请求结束后返回的时候 pop 掉 local = { '标识':{'stack':[RequestContext(),]} } 2 补充 partial

flask上下文

Flask提供了两种上下文,一种是应用上下文(Application Context),一种是请求上下文(Request Context). application 指的就是当你调用app = Flask(name)创建的这个对象app: request 指的是每次http请求发生时,WSGI server(比如gunicorn)调Flask.call()之后,在Flask对象内部创建的Request对象: application 表示用于响应WSGI请求的应用本身,request 表示每次ht

flask上下文管理

flask的上下文管理分应用上下文和请求上下文: 官方文档里是说先理解应用上下文比较好,不过我还是觉得反过来,从请求上下文开始记录比较合适,所以这篇先记录请求上下文. 那么问题来了,什么才是请求上下文: 通俗点说,其实上下文就像一个容器,包含了很多你需要的信息 request和session都属于请求上下文 request 针对的是http请求作为对象 session针对的是更多是用户信息作为对象 上下文的结构 说到上下文这个概念的数据结构,这里需要先知道,他是运用了一个Stack的栈结构,也就