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

简介: 引言本文主要梳理了flask的current_app, request, session, g的实现原理源码说明本文使用flask 0.5 版本application context 和request contextflask有两个context: application context和...

引言

本文主要梳理了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

 

                                                                   -------  知识无价,汗水有情,如需搬运请注明出处,谢谢!

目录
相关文章
|
26天前
|
API 数据库 Python
二、学习 Flask之二
二、学习 Flask之二
33 0
|
6月前
|
存储 中间件 数据库连接
揭开Flask上下文管理的神秘面纱
【4月更文挑战第15天】Flask的上下文管理涉及应用上下文和请求上下文,简化了Python Web开发。应用上下文存储全局数据,如数据库连接,而请求上下文处理请求相关数据,如URL参数。通过全局变量`current_app`和`request`访问上下文信息。上下文管理在视图函数、中间件和扩展开发中发挥作用,提高代码效率和应用可扩展性。理解这一机制有助于提升Flask开发技能。
|
6月前
|
人工智能 前端开发 算法
Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程
Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程
107 4
|
API 数据库 网络架构
Python Flask框架学习教程
概述: 本教程将介绍Python Flask框架的基础知识和使用方法。Flask是一个简单而灵活的Web应用框架,它具有轻量级、易用性和高度可扩展等特点。通过学习本教程,您将能够了解Flask的基本概念、安装方法、语法结构、模板使用以及实际案例,并通过练习题加深对框架的理解和应用。
|
Python
python学习之Flask框架(二)
python学习之Flask框架(二)
|
前端开发 Python
python学习之Flask框架(一)
前言:本人广西医科大学公共事业管理专业大二学生,大一开始自学python,大一期末报名了python课程学习,目前学习到flask框架(因为高中文科生和英语不太行的缘故,学习进度较慢),前面的笔记都是手写,后续笔记将会在csdn上传,希望能够记录下自己的成长过程,也希望各位社区大佬能够多多指点。
高频面试题之Flask框架的上下文
Flask框架中分为2种上下文: 请求上下文(request context)和应用上下文(app context) 一般面试的问点在于:两种上下文是什么? 有什么区别? 什么场景下使用?
|
前端开发 Python
Flask学习与实战11:WebSocket的使用与简单通信
用这个协议最方便的就是,服务器主动向客户端推送信息。客户端也可以主动向服务器发送信息。属于应用层协议,在握手阶段还是使用了HTTP的协议。
Flask学习与实战11:WebSocket的使用与简单通信
|
消息中间件 数据采集 Java
Flask嵌套启动子线程如何读取请求上下文?
Flask嵌套启动子线程如何读取请求上下文?
222 0
|
存储 Shell 测试技术
Flask 上下文是什么 ?
Flask 上下文是什么 ?