【python】flask执行上下文context,请求上下文和应用上下文原理解析

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,面试宝典等分享。

所属的专栏:flask框架零基础,进阶应用实战教学
景天的主页:景天科技苑

文章目录

  • 执行上下文[context]
    • 请求上下文(request context)
    • 应用上下文(application context)
      • current_app
      • g变量
      • 两者区别:
    • 总结

执行上下文[context]

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

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 context)

思考:在视图函数中,如何取到当前请求的相关数据?比如:请求地址,请求方式,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)
    #外部函数在视图函数里面调用,也能使用request或session
    test()
    return "ok"


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

浏览器请求:
在这里插入图片描述

看下终端打印,可以看到当在外部函数中定义上下文,且在视图函数中调用时,是可以执行的
在这里插入图片描述

应用上下文(application context)

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

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

current_app

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

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

案例剖析

from flask import Flask,request,session,current_app,g

# 初始化
app = Flask(import_name=__name__)

# 声明和加载配置
class Config(object):
    DEBUG = True
app.config.from_object(Config)

# 编写路由视图
@app.route(rule='/')
def index():
    #打印应用上下文对象
    print("应用上下文对象:",app)

    #判断我们设置的app与falsk内置的current_app是否相同
    print(app == current_app) #True

    # 应用上下文提供给我们使用的变量,也是只能在视图或者被视图调用的地方进行使用,
    # 但是应用上下文的所有数据来源于于app,每个视图中的应用上下文基本一样
    print(current_app.config)   # 获取当前项目的所有配置信息
    print(current_app.url_map)  # 获取当前项目的所有路由信息

    return "<h1>hello world!</h1>"

if __name__ == '__main__':

    #current_app在全局下是不能执行的,如果非要执行,需要创建个本地上下文环境
    # with app.app_context(): # 构建一个应用上下文环境
    #     print(current_app)
    # 运行flask
    app.run(host="0.0.0.0")

浏览器访问后,看终端打印
在这里插入图片描述

g变量

g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别
g.name=‘abc’ # name是举例,实际要保存什么数据到g变量中,可以根据业务而定,你可以任意的数据进去
当flask项目越做越大,针对不同的文件,在同一次请求中,可以使用g变量来共享数据。
注意:

客户端不同的请求,会有不同的全局变量g,或者说,每一个客户端都拥有属于自己的g变量。

案例剖析

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()
    return "ok"

def t1():
    # 存储数据
    g.user_id = 100
    print('t1执行了')

def t2():
    # 提取数据
    print('t2中获取到的数据:',g.user_id)

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000, debug=True)

浏览器访问,查看终端打印
可以看到在t1中定义的数据,通过g变量可以在t2函数中获取
在这里插入图片描述

两者区别:

  • 请求上下文:保存了客户端和服务器交互的数据,一般来自于客户端的HTTP请求。

  • 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如路由列表,程序名、数据库连接、应用信息等

    应用上下文提供的对象,可以直接在请求上下文中使用,但是如果在请求上下文之外调用,则需要使用

    with app.app_context()创建一个应用上下文环境才能调用。

总结

综上就是flask请求上下文和应用上下文原理分析和案例应用分享,
请求上下文对象:保存了 Flask 程序运行过程中的一些信息[变量、函数、类与对象等信息]。
应用程序上下文,用于存储flask应用实例对象中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量。

感兴趣的朋友可以一键三连,flask持续更新中!!!

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

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

相关文章

2024河北石家庄矿业矿山展览会|河北智慧矿山展会|河北矿博会

2024中国&#xff08;石家庄&#xff09;国际矿业博览会      时间&#xff1a;2024年7月4-6日 地点&#xff1a;石家庄国际会展中心.正定      随着全球经济的持续增长和矿产资源需求的不断攀升&#xff0c;矿业行业正迎来前所未有的发展机遇。作为矿业领域的盛会&…

3.28C++

复数类的实现&#xff0c;写出三种构造函数&#xff0c;算术运算符、关系运算符、逻辑运算符重载尝试实现自增、自减运算符的重载 #include <iostream> using namespace std; class Num {int rel; //实部int vir; //虚部 public:Num():rel(2),vir(1){}Num(int rel,…

确保未来安全:应对云安全的复杂性

云是业务运营的重要组成部分&#xff0c;它改变了组织扩展、创新和适应的方式。然而&#xff0c;其影响力日益增长的广度和深度不仅仅局限于商业领域。云环境是我们日常生活中不可或缺的一部分&#xff0c;负责存储和传输全球平民最敏感的数据。随着大量企业和个人利用云&#…

【C语言】编译和链接----从源代码到可执行程序的转换【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作揭秘&#xff1a;C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 欢迎来到本篇博客&…

最小化安装Kubesphere报错问题解决方法

最小化安装Kubesphere报错: TASK [preinstall : Stop if defaultStorageClass was not found] ****************** fatal: [localhost]: FAILED! > {"assertion": "\"(default)\" in default_storage_class_check.stdout", "changed&qu…

数据结构进阶篇 之 【二叉树链序存储】的整体实现讲解

封建迷信我嗤之以鼻&#xff0c;财神殿前我长跪不起 一、二叉树链式结构的实现 1.二叉树的创建 1.1 手动创建 1.2 前序递归创建 2.二叉树的遍历 2.1 前序&#xff0c;中序以及后序遍历概念 2.2 层序遍历概念 2.3 前序打印实现 2.4 中序打印实现 2.4 后序打印实现 2.…

SnapGene 5 for Mac 分子生物学软件

SnapGene 5 for Mac是一款专为Mac操作系统设计的分子生物学软件&#xff0c;以其强大的功能和用户友好的界面&#xff0c;为科研人员提供了高效、便捷的基因克隆和分子实验设计体验。 软件下载&#xff1a;SnapGene 5 for Mac v5.3.1中文激活版 这款软件支持DNA构建和克隆设计&…

Linux_进程概念_冯诺依曼_进程概念_查看进程_获取进程pid_创建进程_进程状态_进程优先级_环境变量_获取环境变量三种方式_3

文章目录 一、硬件-冯诺依曼体系结构二、软件-操作系统-进程概念0.操作系统做什么的1.什么叫做进程2.查看进程3.系统接口 获取进程pid- getpid4.系统接口 获取父进程pid - getppid5.系统接口 创建子进程 - fork1、手册2、返回值3、fork做了什么4、基本用法 6.进程的状态1、进程…

【Java扫盲篇】String、String Buffer和String Builder的区别

你在面试时&#xff0c;面试官让你讲讲String String Buffer String Builder的区别&#xff0c;你是否能流畅的、完整的叙述出他们三者的区别? ✍先说结论 相同点&#xff1a; 他们的底层都是由char数组实现的。不同点&#xff1a; String对象一旦创建&#xff0c;是不能修…

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十六)

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十五六) 一、算法介绍二、使用步骤1.代码2.效果一、算法介绍 写论文当然用RANSAC的优化变种算法MSAC啊,RANSAC太土太LOW了哈哈 MSAC算法(M-estimator Sample Consensus)是RANSAC(Random Sample Consensus)的一种…

初入C++

C 编译时的查找&#xff1a; 先到函数局部域里查找到全局域找 局部域和全局域会改变生命周期。 命名空间域不会影响变量的生命周期。 默认情况下不会到命名空间域去找。(命名空间域内的变量的生命周期是全局的&#xff0c;及不会出命名空间就销毁) 在不同的作用域可以定义同…

Linux系统-----------MySQL 数据类型

目录 MySQL 数据类型 一、数值类型 二、日期和时间类型 三、字符串类型 &#xff08;1&#xff09;CHAR类型 &#xff08;2&#xff09;VARCHAR类型 &#xff08;3&#xff09;CHAR和VARACHAR的比较及其应用场景 MySQL 数据类型 MySQL 中定义数据字段的类型对你数据库的…

OC对象 - Block解决循环引用

文章目录 OC对象 - Block解决循环引用前言1. 循环引用示例1.1 分析 2. 解决思路3. ARC下3.1 __weak3.2 __unsafe_unretained3.3 __block 4. MRC下4.1 __unsafe_unretain....4.1 __block 5. 总结5.1 ARC下5.2 MRC下 OC对象 - Block解决循环引用 前言 本章将会通过一个循环引用…

深入解析RSA算法原理及其安全性机制

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、RSA算法简介二、RSA算法原理2.1 背景与数学基础2.2 密钥生成2.3 加密过程2.4 解密过程 三、安全性考虑四、RSA的使用五、…

P2602 [ZJOI2010] 数字计数

经典计数问题&#xff0c;注意0的判断 所以要引入前导0标记 #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; #define int long long const int N 1e510; const int inf 0x3f3f3f3f; const int mod 1e97; int gcd(…

华为OD机试 - 考古问题 - 回溯、全排列问题(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

自动化测试:Selenium中的时间等待

在 Selenium 中&#xff0c;时间等待指在测试用例中等待某个操作完成或某个事件发生的时间。Selenium 中提供了多种方式来进行时间等待&#xff0c;包括使用 ExpectedConditions 中的 presence_of_element_located 和 visibility_of_element_located 方法等待元素可见或不可见&…

StartAI修图实例教程之海报修图

发现AI的另一种用法——AI修图。想必许多电商小伙伴都会遇到海报修图问题&#xff0c;今天我们就来看看怎么处理&#xff01; 原图&#xff1a; 1.我们用PS自带的魔法棒工具进行选区&#xff0c;选择海报中需要修改的区域。我们今天是已“2024”两个字为例 效果图&#xff1…

每日必学Linux命令:cd命令

1.命令格式&#xff1a; cd [目录名]2.命令功能 切换当前目录至 [目录名]3. 常用范例 1.进入系统根目录 命令&#xff1a; cd / 说明&#xff1a;进入系统根目录,上面命令执行完后拿ls命令看一下&#xff0c;当前目录已经到系统根目录了 输出&#xff1a; hchc-virtu…

【YOLOv5改进系列(5)】高效涨点----添加密集小目标检测NWD方法

文章目录 &#x1f680;&#x1f680;&#x1f680;前言一、1️⃣ 修改loss.py文件1.1 &#x1f393; 修改11.2 ✨ 修改21.3 ⭐️相关代码的解释 二、2️⃣NWD实验2.1 &#x1f393; 实验一&#xff1a;基准模型2.2 ✨实验二&#xff1a;NWD权重设置0.52.3 ⭐️实验三&#xf…
最新文章