关于Flask高级_上下文的介绍和基本操作

Flask高级_上下文

一.上下文

每一段程序都有很多外部变量,只有像add这种简单的函数才是 没有外部变量的。 一旦一段程序有了外部变量,这段程序就不 完整,不能独立运行。为了能让这段程序可以运行,就要给所 有的外部变量一个一个设置一些值。就些值所在的集合就是叫 上下文。
并且上下文这一概念在中断任务的场景下具有重大意义,其中 任务在被中断后,处理器保存上下文并提供中断处理,因些在 这之后,任务可以在同一个地方继续执行。(上下文越小,延迟 越小)
上下文的一个典型应用场景就是用来缓存一些我们需要在发生请求 之前或者要使用的资源。举个例子,比如数据库连接。当我们在应 用上下文中来存储东西的时候你得选择一个唯一的名字,这是因为 应用上下文为 Flask 应用和扩展所共享。

二.应用上下文

应用上下文是存放到一个 LocalStack 的栈中。和应用app相关的操作就 必须要用到应用上下文
注意:
在视图函数中,不用担心应用上下文的问题。因为视图函数要 执行,那么肯定是通过访问url的方式执行的, 那么这种情况下,Flask底层就已经自动的帮我们把应用上下文 都推入到了相应的栈中。
如果想要在视图函数外面执行相关的操作,那么就必须要手动推入应用上下文。

三.请求上下文

请求上下文也是存放到一个 LocalStack 的栈中。
和请求相关的操作就必须用到请求上下文,比如使用 url_for 反转视图 函数
注意:
在视图函数中,不用担心请求上下文的问题。
因为视图函数要执行,那么肯定是通过访问url的方式执行的, 那么这种情况下,Flask底层就已经自动的帮我们把应用上下文 和请求上下文都推入到了相应的栈中。
如果想要在视图函数外面执行相关的操作,那么就必须要手动推入请求上下文。
底层代码执行说明:
  1. 推入请求上下文到栈中,会首先判断有没有应用上下文
  2. 如果没有那么就会先推入应用上下文到栈中
  3. 然后再推入请求上下文到栈中

四.总结

为什么上下文需要放在栈中?
  1. 应用上下文:Flask底层是基于werkzeug,werkzeug是可以 包含多个app的,所以这时候用一个栈来保存。 如果你在使用app1,那么app1应该是要在栈的顶部,如果用完 了app1,那么app1应该从栈中删除。方便其他代码使用下面的 app。
  2. 如果在写测试代码,或者离线脚本的时候,我们有时候可能 需要创建多个请求上下文,这时候就需要存放到一个栈中了。 使用哪个请求上下文的时候,就把对应的请求上下文放到栈的 顶部,用完了就要把这个请求上下文从栈中移除掉。

五.实例

#coding=utf-8

from flask import Flask,current_app,url_for


app = Flask(__name__)

app_context = app.app_context()
app_context.push()
print(current_app.name)

with app.app_context():
    print(current_app.name)

@app.route('/show/')
def show():
    return f'这是一个内容:{current_app.name}'

with app.test_request_context():
    url = url_for('show')
    print(f'show函数的映射路径为:{url}')

if __name__ == '__main__':
    app.run(debug=True)

在这里插入图片描述

注:
如果觉得笔记有些问题,麻烦在百忙之中在评论中指正,或提出建议!另外,如果觉得这份笔记对你有所帮助,麻烦动动发财的小手手点一波赞!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值