[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, sessionapp = 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, gapp = 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 = 100def 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)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年腾讯云4核8G服务器多少钱一年?买1年送3个月

2024年腾讯云4核8G服务器租用优惠价格:轻量应用服务器4核8G12M带宽646元15个月,CVM云服务器S5实例优惠价格1437.24元买一年送3个月,腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图: 腾讯云4核8G服务器优惠价格 轻…

华为数通 HCIP-Datacom H12-831 题库补充(3/27)

2024年 HCIP-Datacom(H12-831)最新题库,完整题库请扫描上方二维码,持续更新。 如图所示,关于R4路由器通过IS-IS计算出来的IPv6路由,哪一选项的描述是错误的? A:R4通过IS—IS只学习到…

取消springboot中的Test类中的日志打印

使用SpringBootTest注解进行单元测试时, 打印东西的时候,总会伴随很多的无关紧要的日志信息,影响观感。去掉这些日志应该怎么做呢 ? 两个步骤: 第一步、修改application.properties logging.level.rootoff logging.level.org.springframeworkoff # 关闭baner信息…

SpringMvc执行流程源码解析

一、简介 Spring web Mvc是基于ServletApi构建的原始Web模块,从一开始就包含在Spring框架中; 从Servlet到SpringMvc 最典型的MVc就是JSPServletjavaBean的模式; 弊端: 1、xml下配置Servlet的映射非常麻烦,效率低&…

vue3+threejs新手从零开发卡牌游戏(十三):上场手牌添加攻击力文字

在utils/common.ts下新建渲染场上手牌文字方法: // 渲染场上手牌文字 const renderSiteCardText (mesh: any, font: any) > {return new Promise((resolve, reject) > {let pos mesh.positionconst geometry new TextGeometry( ATK ${mesh.userData._ATK}…

Windows直接运行python程序

Windows直接运行python程序 一、新建bat脚本二、新建vbs脚本 一、新建bat脚本 新建bat批处理脚本,写入以下内容 echo off call conda activate pytorch python app.pyecho off:在此语句后所有运行的命令都不显示命令行本身,但是本身的指令是…

ETIM -国际贸易的产品分类标准

ETIM 是除了XML 国际交流标准BMEcat之外的国际贸易的产品分类标准。 什么是ETIM ? ETIM是一种基于分类识别共享和交换产品数据的格式。这种广泛使用的技术产品分类标准是为了构建 B2B 专业人员之间的信息流而制定的。 为什么选择ETIM? ETIM分类模型的开…

力扣454. 四数相加 II

思路:把四个数组拆成两对,两个分别相加,记录第一对的相加结果进map里,再把第二对数组 0-nums2-nums4 去map里面找出现了几次,这题不用对重复的四元组去重,所以出现多次都有效。 class Solution {public int…

Linux系统使用Docker部署Jupyter Notebook结合内网穿透实现公网访问本地笔记

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook,并结合cpolar内网穿透…

Vue 3中ref和reactive的区别

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【C++】拆分详解 - 类与对象

文章目录 一、面向过程和面向对象初步认识二、类的引入  2.1 类的定义  2.2 类的访问限定符及封装   2.2.1  访问限定符   2.2.2  C中struct和class的区别是什么?   2.2.3  封装 2.3 类的作用域  2.4 类的实例化  2.5 类对象模型   2.5.1  …

智慧公厕,让数据和技术更好服务社会生活

智慧公厕,作为智慧城市建设中不可忽视的一部分,正逐渐受到越来越多人的关注。随着科技的不断进步,智能化公厕已经成为一种趋势,通过数据的流转和技术的整合,为社会生活带来了更好的服务。本文以智慧公厕源头实力厂家广…