网站开发运维机构设置,甘肃交通工程建设监理有限公司网站,服装企业网站建设的目的,html菜鸟工具✨✨ 欢迎大家来到景天科技苑✨✨
#x1f388;#x1f388; 养成好习惯#xff0c;先赞后看哦~#x1f388;#x1f388; #x1f3c6; 作者简介#xff1a;景天科技苑 #x1f3c6;《头衔》#xff1a;大厂架构师#xff0c;华为云开发者社区专家博主#xff0c;…
✨✨ 欢迎大家来到景天科技苑✨✨ 养成好习惯先赞后看哦~ 作者简介景天科技苑 《头衔》大厂架构师华为云开发者社区专家博主阿里云开发者社区专家博主CSDN新星创作者掘金优秀博主51CTO博客专家等。 《博客》Python全栈前后端开发人工智能js逆向App逆向网络系统安全数据分析Djangofastapiflask等框架linuxshell脚本等实操经验网站搭建面试宝典等分享。 所属的专栏flask框架零基础进阶应用实战教学 景天的主页景天科技苑 文章目录 执行上下文[context]请求上下文(request context)应用上下文(application context)current_appg变量两者区别 总结 执行上下文[context]
执行上下文即语境语意在程序中可以理解为在代码执行到某一行时根据之前代码所做的操作以及下文即将要执行的逻辑可以决定在当前时刻下可以使用到的变量或者可以完成的事情。
Flask中提供的执行上下文对象相当于一个容器保存了 Flask 程序运行过程中的一些信息[变量、函数、类与对象等信息]。
Flask中有两种上下文请求上下文(request context)和应用上下文(application context)。
application 指的就是当服务端调用app Flask(__name__)创建的这个对象apprequest 指的是每次客户端发生http请求时WSGI server(比如uwsgi/gunicorn)调用Flask.__call__()之后在Flask对象内部创建本次客户端的Request对象application 表示用于响应WSGI请求的应用本身request 表示服务端每次响应客户端的http请求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, sessionapp Flask(__name__)app.config[SECRET_KEY] my secret keydef test():print(request) # 请求上下文所提供的对象[request或session]只能被视图直接或间接调用app.route(/)
def index():print(request)print(session)#外部函数在视图函数里面调用也能使用request或sessiontest()return okif __name__ __main__:# print(request) # 没有发生客户端请求时调用request会超出请求上下文的使用范围app.run(host0.0.0.0, port5000, debugTrue)浏览器请求
看下终端打印可以看到当在外部函数中定义上下文且在视图函数中调用时是可以执行的
应用上下文(application context)
它的字面意思是 应用上下文但它不是一直存在的它只是request context 中操作当前falsk应用对象 app 的代理对象就是所谓本地代理(local proxy)。 它的作用主要是帮助 request 获取当前的flask应用相关的信息它是伴 request 而生随 request 而灭的。
应用上下文提供的对象有current_appg
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 h1hello world!/h1if __name__ __main__:#current_app在全局下是不能执行的如果非要执行需要创建个本地上下文环境# with app.app_context(): # 构建一个应用上下文环境# print(current_app)# 运行flaskapp.run(host0.0.0.0)浏览器访问后看终端打印
g变量
g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据g 保存的是当前请求的全局变量不同的请求会有不同的全局变量通过不同的thread id区别 g.name‘abc’ # name是举例实际要保存什么数据到g变量中可以根据业务而定你可以任意的数据进去 当flask项目越做越大针对不同的文件在同一次请求中可以使用g变量来共享数据。 注意
客户端不同的请求会有不同的全局变量g或者说每一个客户端都拥有属于自己的g变量。
案例剖析
from flask import Flask, current_app, gapp Flask(__name__)app.config[SECRET_KEY] my secret keyapp.route(/)
def index():print(app current_app) # current_app就是app应用实例对象在视图中的本地代理对象print(g) # 全局数据存储对象用于保存服务端存储的全局变量数据[可以理解为用户级别的全局变量存储对象]t1()t2()return okdef t1():# 存储数据g.user_id 100print(t1执行了)def t2():# 提取数据print(t2中获取到的数据:,g.user_id)if __name__ __main__:app.run(host0.0.0.0, port5000, debugTrue)浏览器访问查看终端打印 可以看到在t1中定义的数据通过g变量可以在t2函数中获取
两者区别 请求上下文保存了客户端和服务器交互的数据一般来自于客户端的HTTP请求。 应用上下文flask 应用程序运行过程中保存的一些配置信息比如路由列表程序名、数据库连接、应用信息等 应用上下文提供的对象可以直接在请求上下文中使用但是如果在请求上下文之外调用则需要使用 with app.app_context()创建一个应用上下文环境才能调用。
总结
综上就是flask请求上下文和应用上下文原理分析和案例应用分享 请求上下文对象保存了 Flask 程序运行过程中的一些信息[变量、函数、类与对象等信息]。 应用程序上下文,用于存储flask应用实例对象中的变量可以通过current_app.name打印当前app的名称也可以在current_app中存储一些变量。
感兴趣的朋友可以一键三连flask持续更新中