[flask]执行上下文的四个全局变量

flask上下文全局变量,程序上下文、请求上下文、上下文钩子 -- - 夏晓旭 - 博客园 (cnblogs.com)
执行上下文

执行上下文:即语境,语意,在程序中可以理解为在代码执行到某一行时,根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情。

Flask中提供的执行上下文对象:相当于一个容器,保存了 Flask 程序运行过程中的一些信息[变量、函数、类与对象等信息。

Flask中有两种上下文,请求上下文(request context)和应用上下文(application context)

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

在不同的视图函数中,request对象都表示和视图函数对应的请求,就是当前请求(current request)。程序会有多个程序实例的情况,为了能获取对应的程序实例,而不是固定的某一个程序实例,我们就需要使用current_app变量。

g存储在程序上下文中,而程序上下文会随着每一个请求的进入而激活,随着每一个请求的处理完毕而销毁,所以每次请求都会重设这个g值

我们通常会使用它结合钩子来保存每个请求处理前所需要的全局变量。

当请求进入时,flask会自动激活请求上下文,这时可以使用request和session变量。当请求上下文被激活时,程序上下文也被自动激活。

请求上下文

思考:在视图函数中,如何取到当前请求的相关数据?

比如:请求地址,请求方式,cookie等等

在 flask 中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request就是请求上下文提供的对象,保存了当前本次请求的相关数据,请求上下文提供的对象有:request,session

所以每次客户端发生不同的HTTP请求时,得到的request和session的对象都是同一个,但是内部的数据都是不一样的。

- request
  - 封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
- session
  - 用来记录请求会话中的信息,针对的是会话状态。举例:session['name'] = user.id,可以记录用户的状态信息。还可以通过session.get('name')获取用户的状态信息。

请求上下文提供的变量/属性/方法/函数/类与对象,只能在视图或者视图调用的地方使用

from flask import Flask, request, session


app = Flask(__name__)

app.config["SECRET_KEY"] = "my secret key"

def test():
    print(request) # 请求上下文所提供的对象[request或session]只能被视图直接或间接调用!

@app.route("/")
def index():
    print(request)
    print(session)
    test()
    return "ok"


if __name__ == '__main__':
    # print(request) # 没有发生客户端请求时,调用request会超出请求上下文的使用范围!
    app.run(host="0.0.0.0", port=5000, debug=True)

这里说明,请求上下文提供的对象[request或session]只能被视图直接或间接调用

应用上下文

它的字面意思是 应用上下文,,,,但它不是一直存在的,它只是request context 中操作当前falsk应用对象 app 的代理对象,就是所谓本地代理(local proxy)。它的作用主要是帮助 request 获取当前的flask应用相关的信息,它是伴 request 而生,随 request 而灭的。

应用上下文提供的对象有:current_app,g

应用程序上下文,用于存储flask应用实例对象中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:

- 应用的启动脚本是哪个文件,启动时指定了哪些参数
- 加载了哪些配置文件,导入了哪些配置
- 连接了哪个数据库
- 有哪些可以调用的工具类、常量
- 当前flask应用在哪个机器上,哪个IP上运行,内存多大

from flask import Flask, current_app, g


app = Flask(__name__)

app.config["SECRET_KEY"] = "my secret key"

@app.route("/")
def index():
    print(app == current_app)  # current_app就是app应用实例对象在视图中的本地代理对象
    print(g)  # 全局数据存储对象,用于保存服务端存储的全局变量数据[可以理解为用户级别的全局变量存储对象]
    t1()
    t2()
    print(current_app.config)
    return "ok"

def t1():
    # 存储数据
    g.user_id = 100

def t2():
    # 提取数据
    print(g.user_id)

if __name__ == '__main__':
    # print(app)
    # with app.app_context(): # 构建一个应用上下文环境
    #     print(current_app)
    # print(request) # 没有发生客户端请求时,调用request会超出请求上下文的使用范围!
    app.run(host="0.0.0.0", port=5000, debug=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/494463.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macos下 jupyter服务安装和vscode链接密码设置 .ipynb文件

最近收到了一些后缀为.ipynb的文件, 这个文件就是使用jupyter编辑的,于是就需要安装一个jupyter服务, 对于最新版本的jupyter 网上很多的资料都已经过期了,这里以最新版本的jupyter为例。 jupyter lab安装 jupyter 这个工具包含…

基于遗传算法的智能天线最佳阵列因子计算matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于遗传算法的智能天线最佳阵列因子计算。智能天线技术利用自适应阵列处理技术改善无线通信系统的性能,尤其是提高接收信号质量、抑制干扰和增强定位能力。在智能…

集合系列(十六) -集合知识回顾整理

一、摘要 在 Java 中,集合大致可以分为两大体系,一个是 Collection,另一个是 Map,都位于java.util包下。 Collection :主要由 List、Set、Queue 接口组成,List 代表有序、重复的集合;其中 Set…

C语言:文件操作详解

什么是文件 文件是是计算机硬盘存储的数据的集合,它可以是文本文档,也可以是图片,程序等等。将数据存储进文件内可以很好的保存数据,方便程序员对文件的操作。 文件的类型 一般根据存储数据类型的不同可以分为二进制文件和文本文…

python的神奇bug2

今天测试出一个很诡异的bug, 这个错误还真的很难发现 测试1 a [1,10,100] for i in a:print(i)if(i10):a[20,30,-1]一般来说我们在进行迭代时,a这个值时不能改动的,但是现在的问题时如果我不小心给改动了呢,结果如下 也就是说…

通过Jmeter准备压测数据-mysql示例

1、新建线程组 总共30万条数据 2、创建jdbc链接 创建jdbc连接配置 配置mysql连接 需要在jmeter安装的路径\apache-jmeter-5.6.3\lib\ext 目录下添加mysql 驱动 3、创建jdbc请求 jdbc链接名称需要与上一步中的保持一致,同时添加insert语句 例如 INSERT INTO test…

让手机平板成为AI开发利器:AidLux

想ssh登录自己的手机吗? 想在手机上自由的安装lynx、python、vscode、jupyter甚至飞桨PaddlePaddle、Tensorflow、Pytorch和昇思Mindspore吗? 那么看这里....装上AidLux,以上全都有! AidLux是一个综合的AI开发平台,…

nvm安装以后,node -v npm 等命令提示不是内部或外部命令

因为有vue2和vue3项目多种,所以为了适应各类版本node,使用nvm管理多种node版本,但是当我按教程安装nvm以后,nvm安装以后,node -v npm 等命令提示不是内部或外部命令 首先nvm官网网址:https://github.com/coreybutler/…

java调用jacob进行文件转换ppt转pdf或者png

java调用jacob进行文件转换ppt转pdf或者png 前情提要 最近项目上,遇到一个复杂的ppt,最终要求是要将ppt每一页转成图片原本这个是不难,网上一搜一大堆案例,外加我本身也比较精通aspose,那还不是分分钟搞定。结果就是…

实测梳理一下kafka分区分组的作用

清空topickafka-topics.sh --bootstrap-server localhost:9092 --delete --topic second创建分区kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic second发kafka-console-producer.sh --bootstrap-server localhos…

Node.js【入门级】

node 可以脱离浏览器来执行js代码,没有DOM和BOM对象,针对后端可以编写接口,提供网页资源,前端可以集成各种工具(承上启下)Buffer Buffer相关操作 let buf Buffer.alloc(10) console.log(buf); let buf_2 Buffer.allocUnsafe(10…

【GitLab】Ubuntu 22.04 快速安装 GitLab

在 Ubuntu 22.04 上安装最新版本的 GitLab,可以按照以下步骤操作: 1. 更新系统: 在终端中执行以下命令以确保系统是最新的: sudo apt update sudo apt upgrade2. 安装依赖: 安装 GitLab 所需的依赖包: …

Hack.Summit() 2024再添亮点:Morphism CEO Cecilia Hsueh确认出席

随着Web3技术的风起云涌,区块链行业正在全球范围内以前所未有的速度崭露头角。而在这场变革的浪潮中,备受瞩目的区块链盛会——Hack.Summit() 2024区块链开发者大会,将于2024年4月9日至10日,在香港数码港拉开帷幕。这不仅标志着Ha…

图书推荐|Django+Vue.js商城项目实战

一线资深架构师 凝聚近十年大型系统开发经验 倾力打造 双色印刷 适合:项目演练求职应聘技术提升 全新:Django 4.x与Vue.js 3.x全栈技术 易学:娓娓道来图示指引原理剖析步骤解说代码详注 真实企业级项目技术细节完整揭秘,照着做就…

逆向案例9--小鹅通视频m3u8内容解密--含简单webpack

视频网址:https://app4nseessp8638.h5.xiaoeknow.com/v2/course/alive/l_65b9e8dfe4b064a83b90e102?type2&app_idapp4nseessp8638&channel_id&res_type4&pro_id&res_idl_65b9e8dfe4b064a83b90e102 按照惯例,刷新网站,搜…

Docker数据卷挂载

一、容器与数据耦合的问题: 数据卷是虚拟的,不真实存在的,它指向文件中的文件夹 ,属主机文件系统通过数据卷和容器数据进行联系,你改变我也改变。 解决办法: 对宿主机文件系统内的文件进行修改,会立刻反应…

MyBatis入门01

MyBatis入门01 文章目录 MyBatis入门01前言一、搭建环境1.新建一个普通的maven项目2.删除src目录3.导入maven依赖:mysql驱动(操作jdbc),juint,mybatis注意:要假如builder标签,预防配置文件不可导…

【OpenCV】 OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Python、Ruby、MATLAB等语…

ip协议和数据链路层!

今天我们来学ip协议! 如果我们想要两台主机之间能够通信必须知道双方的ip地址才能进行标识对方然后进行通信! 首先是4位首部长度,与tcp同理*4才是报头的真实大小!(即20-60)(最低开始读20&#x…

Django auth模块

【一】命令行创建用户 【1】语法 python manage.py createsuper【2】示例 用户名 默认是是电脑名称 邮箱 可以填也可以不填 密码 terminal中:输入密码不显示出来manage.py中:明文输入输入密码太简单会提示 Username (leave blank to use administra…