Flask高级_上下文
一.上下文
每一段程序都有很多外部变量,只有像add这种简单的函数才是 没有外部变量的。 一旦一段程序有了外部变量,这段程序就不 完整,不能独立运行。为了能让这段程序可以运行,就要给所 有的外部变量一个一个设置一些值。就些值所在的集合就是叫 上下文。
并且上下文这一概念在中断任务的场景下具有重大意义,其中 任务在被中断后,处理器保存上下文并提供中断处理,因些在 这之后,任务可以在同一个地方继续执行。(上下文越小,延迟 越小)
上下文的一个典型应用场景就是用来缓存一些我们需要在发生请求 之前或者要使用的资源。举个例子,比如数据库连接。当我们在应 用上下文中来存储东西的时候你得选择一个唯一的名字,这是因为 应用上下文为 Flask 应用和扩展所共享。
二.应用上下文
应用上下文是存放到一个 LocalStack 的栈中。和应用app相关的操作就 必须要用到应用上下文
注意:
在视图函数中,不用担心应用上下文的问题。因为视图函数要 执行,那么肯定是通过访问url的方式执行的, 那么这种情况下,Flask底层就已经自动的帮我们把应用上下文 都推入到了相应的栈中。
如果想要在视图函数外面执行相关的操作,那么就必须要手动推入应用上下文。
三.请求上下文
请求上下文也是存放到一个 LocalStack 的栈中。
和请求相关的操作就必须用到请求上下文,比如使用 url_for 反转视图 函数
注意:
在视图函数中,不用担心请求上下文的问题。
因为视图函数要执行,那么肯定是通过访问url的方式执行的, 那么这种情况下,Flask底层就已经自动的帮我们把应用上下文 和请求上下文都推入到了相应的栈中。
如果想要在视图函数外面执行相关的操作,那么就必须要手动推入请求上下文。
底层代码执行说明:
-
推入请求上下文到栈中,会首先判断有没有应用上下文
-
如果没有那么就会先推入应用上下文到栈中
-
然后再推入请求上下文到栈中
四.总结
为什么上下文需要放在栈中?
-
应用上下文:Flask底层是基于werkzeug,werkzeug是可以 包含多个app的,所以这时候用一个栈来保存。 如果你在使用app1,那么app1应该是要在栈的顶部,如果用完 了app1,那么app1应该从栈中删除。方便其他代码使用下面的 app。
-
如果在写测试代码,或者离线脚本的时候,我们有时候可能 需要创建多个请求上下文,这时候就需要存放到一个栈中了。 使用哪个请求上下文的时候,就把对应的请求上下文放到栈的 顶部,用完了就要把这个请求上下文从栈中移除掉。
五.实例
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)

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