资讯专栏INFORMATION COLUMN

flask 上下文的实现

lncwwn / 816人阅读

摘要:值得注意的是这个对象在创建时,将实例的本身作为实参传入自身,因此,。到这里想必已经很清楚了就是指对象就是对应每次请求创建的对象通过将与关联起来总结创建了,这个对应的上下文,就是每响应一个请求,就会创建一个对象,这个对象对应的上下文,就是

引言

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

源码说明

本文使用flask 0.5 版本

application context 和request context

flask有两个context: application contextrequest context

application context request context
current_app request
g session

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

application 指的就是当你调用app = Flask(__name__)创建的这个对象app

request 指的是每次http请求发生时,WSGI server(比如gunicorn)调用Flask.__call__()之后,在Flask对象内部创建的Request对象;

application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;

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关联起来

总结

app = Flask(__name__)创建了application, 这个application对应的上下文,就是application context

Flask每响应一个http请求,就会创建一个Request对象,这个request对象对应的上下文,就是request context

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37717.html

相关文章

  • 一个Flask应用运行过程剖析

    摘要:本文就主要针对一个应用的运行过程进行简要分析,后续文章还会对框架的一些具体问题进行分析。所有的请求处理过程,都会在这个上下文对象中进行。和一些全局变量注意当进入这个上下文对象时,会触发。 相信很多初学Flask的同学(包括我自己),在阅读官方文档或者Flask的学习资料时,对于它的认识是从以下的一段代码开始的: from flask import Flask app = Flask(...

    shmily 评论0 收藏0
  • Flask请求下文和应用下文

    摘要:并且栈顶的元素都是的请求上下文和应用上下文之后,我们再在这个环境中嵌套的应用上下文。这时查看两个栈的内容,发现两个栈中只有的请求的请求上下文对象和应用上下文对象。而等一直指向栈顶的请求上下文对象,分别引用请求上下文的和。 在Flask中处理请求时,应用会生成一个请求上下文对象。整个请求的处理过程,都会在这个上下文对象中进行。这保证了请求的处理过程不被干扰。处理请求的具体代码如下: de...

    sourcenode 评论0 收藏0
  • flask源码走读

    摘要:另外,如果你对模板渲染部分的内容感兴趣,也可以考虑阅读文档文档文档源码阅读,可以参考下面的函数打断点,再测试一个请求,理清过程。 Flask-Origin 源码版本 一直想好好理一下flask的实现,这个项目有Flask 0.1版本源码并加了注解,挺清晰明了的,我在其基础上完成了对Werkzeug的理解部分,大家如果想深入学习的话,可以参考werkzeug_flow.md. 阅读前 为...

    Coly 评论0 收藏0
  • Flask内置命令行工具—CLI

    摘要:如果设置为,命令将激活模式,执行会启用交互式调试器和代码自动重载。也可以通过变量单独控制,表示启用,表示禁用通过设置环境变量略通过设置环境变量略自定义命令命令基于库实现。 应用发现 flask命令在Flask库安装后可使用,使用前需要正确配置FLASK_APP环境变量以告知用户程序所在位置。不同平台设置方式有所不同。 Unix Bash (Linux, Mac, etc.): $ ex...

    nicercode 评论0 收藏0
  • 深入理解flask框架(2):应用下文与请求下文

    摘要:实现一个进程中拥有多个应用上下文机制依赖的数据结构上下文机制的实现基于的。 什么是上下文? flask框架中的上下文本质上就是两个类,我们可以先看一下他的初始化函数:应用上下文 class AppContext(object): The application context binds an application object implicitly to the c...

    wushuiyong 评论0 收藏0

发表评论

0条评论

lncwwn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<