current_app这个坑

36次阅读

共计 1078 个字符,预计需要花费 3 分钟才能阅读完成。

今天同学问了我一个关于 current_app 的问题,我之前也看了一下慕课七月老师讲的 flask 项目,正好碰到过,所以也给大家分享一下。【current_app】之前在写项目的时候也有用到 current_app,老师讲的是代表了当前项目的 app,当然写完项目也没有任何问题,但是通过这次学习,我才发现,好坑呐,真怕不用就忘了。大家看一下下面这段代码
from flask import Flask, current_app

app = Flask(__name__)
print(app) #输出结果:<Flask ‘1_current_app’>
相信大家对这段代码是没有问题的,也不知道有啥作用,那么请看下面这段代码
from flask import Flask, current_app

app = Flask(__name__)
print(app) #输出结果:<Flask ‘1_current_app’>
app2 = current_app
print(app2) #输出结果:竟然报了一大堆的错误
错误信息是这样子的:RuntimeError: Working outside of application context. 意思是说我们在应用上下文之外运行的,这究竟是咋回事,请看下面这幅图
原来在 flask 内部维护者两个线程隔离的栈,current_app 指向了 AppContext(应用上下文) 中的栈顶,request 指向了 RequestContext(请求上下文) 栈顶,当请求进入的时候,Request 对象被压入栈,从而 request 有了指向处理请求,接下来会判断 AppContext 栈顶是否为空,若为空则向栈中压入一个 AppContext 对象,即 app, 从而 current_app 就有了指向,所以我们在项目中使用是没有报错的,而我们上面的代码不是在请求中实现的所以 AppContext 栈顶为空,current_app 并没有指向一个 AppContext 对象,怎样解决呢?
from flask import Flask, current_app

app = Flask(__name__)
print(app) #输出结果:<Flask ‘1_current_app’>
with app.app_context():
app2 = current_app
print(app2) #输出结果:<Flask ‘1_current_app’>
这里我们使用了 with,其 app_context() 返回一个 AppContext 对象,而其又实现了__enter__与__exit__分别让 AppContext 对象,即 app 入栈和出栈,完成了此操作。

正文完
 0