关于Flask 上下文详细介绍
作者:tigeriaf 发布时间:2023-12-10 01:52:32
1、上下文概念
上下文,说白了就是所谓的语境,就是语言环境。比如单独拎出来一篇文章的某一句话,我们可能不能理解它的意思,但是通过这句话所处的语言环境,再结合它前后的语句,就能很轻易的理解。
我们可以把上下文理解为当前环境的快照,是一个用来保存状态的对象。在代码执行的某个时刻,根据上下文的代码逻辑,可以决定在当前时刻下使用到的环境变量等。
2、Flask中的上下文
Flask
中有两种上下文,应用上下文(application context
)和请求上下文(request context
):
application
:指的是调用app = Flask(__name__)
创建的Flask
对象request
:指的是每次HTTP
请求发生时,在Flask
对象内部创建的Request
对象
2.1请求上下文
在Flask
中处理请求时,应用会生成“请求上下文”对象,保存当前请求的相关数据信息,整个请求的处理过程,都会在这个上下文对象中进行,保证请求的处理过程独立不受干扰。
请求上下文对象有:request
和session
,下面以request
为例具体讲解。
在上篇文章Flask 请求钩子的实现 我们说过,在 Flask
中有四种常用的请求钩子,分别是:before_first_request
、before_request
、after_request
和teardown_request
。
@app.before_first_request
def before_first_request():
print(request.url)
print('before_first_request')
@app.before_request
def before_request():
print(request.url)
print('before_request')
@app.after_request
def after_request(response):
print(request.url)
print('after_request')
return response
@app.teardown_request
def teardown_request(e):
print(request.url)
print('teardown_request')
@app.route('/test')
def test():
print(request.url)
return 'test'
通过请求我们发现,在每个请求钩子装饰的处理函数中,我们都可以直接访问 request
对象。而且,在其他普通函数内,无法访问 request
对象,说明 request
对象并不是真正的全局变量,只是在请求上下文的生命周期内可以访问,离开了请求的生命周期,就无法访问了。上面的请求钩子装饰的处理函数,在请求处理的不同阶段执行,自然其内部也可以访问 request
对象。
2.2应用上下文
上面说请求上下文是和请求相关,请求上下文对象保存的是请求的相关数据信息,下面说一下应用上下文,所谓应用上下文,就是和当前应用相关的,应用上下文对象是包含当前应用相关的信息。
应用上下文对象有:current_app
和g
。
我们了解到,每个请求,都有一个 request
对象和视图函数对应,可以理解为当前请求(current request
), 而程序也会有多个实例的情况,为了能获取对应的程序实例,而不是固定的某一个程序实例,我们就需要使用 current_app
变量。
from flask import Flask, current_app
app = Flask("tigeriaf_app")
@app.route('/')
def index():
return 'Hello, {}!'.format(current_app.name)
current_app
是一个本地代理,它的类型是werkzeug.local.LocalProxy
,它所代理的即是app
对象,也就是说current_app == LocalProxy(app)
。所以通过current_app.name
可以获取当前应用的名称,也就是tigeriaf_app
,使用current_app
是因为它也是一个ThreadLocal
变量,对它的改动不会影响到其他线程。我们可以通过current_app._get_current_object()
方法来获取app对象。也可以在current_app
中存储一些自定义的变量。
current_app
只在请求线程内存在,它的生命周期就是在应用上下文里。离开了应用上下文,current_app
一样无法使用。
g
对象是 Flask
程序全局的一个临时变量,充当中间媒介的作用。我们可以通过它传递一些数据,g保存的是当前请求的全局变量,每次请求都会重设这个值,我们通常会使用它结合请求钩子来保存每个请求处理前所需要的全局变量,比如当前登入的用户对象,数据库连接等。 比如,使用g对象保存请求的 token
,在视图函数中就可以直接使用g.name
获取对应的值了。
from flask import g
@app.before_request
def get_token():
g.name = request.headers.get("token")
来源:https://juejin.cn/post/7031340663019044895


猜你喜欢
- 概率论啊概率论,差不多忘完了。基于概率论的分类方法:朴素贝叶斯1. 概述贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称
- DateTimeField日期+时间。与python里的 datetime.datetime 实例同。比如,数据库字段内容为2018-08-
- 00 前言什么是ImageMagick?ImageMagick是一个功能强大的开源图形处理软件,可以用来读、写和处理超过90种的图片文件,包
- tensorflow下设置使用某一块GPU(从0开始编号):import osos.environ["CUDA_DEVICE_OR
- 有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以
- 0.目录1.前言2.安装python3.使用pip下载、安装包3.1 安装Scrapy3.2 安装PyQt3.3 同时安装多个包3.4 pi
- 前言众所周知,appsetting.json 配置文件是.Net 的重大革新之心,抛开了以前繁杂的xml文件,使用了更简洁易懂的json方式
- 基础知识优先使用异常捕获LBYL(look before you leap): 在执行一个可能出错的操作时,先做一些关键的条件判断,仅当满足
- Git 恢复到之前版本1. 应用场景进行了错误提交,需要将代码回退至某个版本;或者需要检出某个版本的代码,再切换回最新版本。2. 解决方法2
- Git的使用基本教程git安装官网 msysgit.github.io(百度搜索git下载地址也行)下载git安装(路径选择你的路径或者默认
- 模型定义常用函数利用nn.Parameter()设计新的层import torchfrom torch import nnclass MyL
- 最近在做编程练习,发现有些结果的值与答案相差较大,通过分析比较得出结论,大概过程如下:定义了一个计算损失的函数:def error(yhat
- 请求:HTTP 请求报文由请求行、请求头部、空行、请求包体4个部分组成,如下图所示:请求行:请求行由方法字段、URL 字段 和HTTP 协议
- 决策树模型  决策树(decision tree)是一种基本的分类与回归方法。 &am
- 概念关键字:array,数据的组合(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器中的所有数据.数组定义语
- 基础知识在学习该漏洞之前我们需要学习一下前置知识来更好的理解该漏洞的产生原因以及如何利用。 我们先来学习一下框架的基本信息以及反序列化漏洞的
- 第一种使用queue队列实现:#生产者消费者模型 其实服务器集群就是这个模型# 这里介绍的是非yield方法实现过程import threa
- 模型经过训练测试之后,我们往往用一两张图对模型预测结果进行分析讨论,那么下面介绍在keras中用已训练的模型经过测试的方法。下面是以利用预训
- 一、正常配置stylus流程1.安装stylus、stylus-loader依赖(进入项目文件夹下)cnpm install stylus
- 有时候在使用 Python 的时候,想要对一个数字或者字符串进行补零操作,即把「1」变为一个八位数的「00000001」,这个时候可以使用一