Python全系列 教程
3567个小节阅读:5930.2k
目录
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
请求上下文:
请求上下文也是存放到一个LocalStack
的栈中。
和请求相关的操作就必须用到请求上下文,比如使用url_for
反转视图函数。
注意
在视图函数中,不用担心请求上下文的问题。
因为视图函数要执行,那么肯定是通过访问url的方式执行的,
那么这种情况下,Flask底层就已经自动的帮我们把应用上下文和请求上下文都推入到了相应的栈中。
注意
如果想要在视图函数外面执行相关的操作,
比如反转url,那么就必须要手动推入请求上下文:
底层代码执行说明:
1. 推入请求上下文到栈中,会首先判断有没有应用上下文
2. 如果没有那么就会先推入应用上下文到栈中
3. 然后再推入请求上下文到栈中
xxxxxxxxxx
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/')
def index():
url = url_for('test_url')
return f'Hello!==={url}'
@app.route('/test/')
def test_url():
return '这个是为了测试请求上下文'
# RuntimeError: Attempted to generate a URL without the application context being pushed.
# This has to be executed when application context is available.
# with app.app_context():
# url = url_for('test_url')
# print(url)
# RuntimeError: Application was not able to create a URL adapter for request independent URL generation.
# You might be able to fix this by setting the SERVER_NAME config variable.
with app.test_request_context():
url = url_for('test_url')
print(url)
if __name__ == '__main__':
app.run(debug = True)
总结
为什么上下文需要放在栈中?
1. 应用上下文:Flask底层是基于werkzeug,werkzeug是可以包含多个app的,所以这时候用一个栈来保存。
如果你在使用app1,那么app1应该是要在栈的顶部,如果用完了app1,那么app1应该从栈中删除。方便其他代码使用下面的app。
2. 如果在写测试代码,或者离线脚本的时候,我们有时候可能需要创建多个请求上下文,这时候就需要存放到一个栈中了。
使用哪个请求上下文的时候,就把对应的请求上下文放到栈的顶部,用完了就要把这个请求上下文从栈中移除掉。
实时学习反馈
1. 在Flask中,对于请求上下文说法错误的是?
A 获取请求上下文时,需要判断是否有应用上下文
B 使用视图函数不用考虑请求上下文,框架会自动推入上下文环境
C 请求上下文只能创建一个,不能同时存在
D 可以通过test_request_context方法获取一个请求上下文
答案
1=>C