1

今天同学问了我一个关于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.意思是说我们在应用上下文之外运行的,这究竟是咋回事,请看下面这幅图

clipboard.png
原来在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入栈和出栈,完成了此操作。


二十一
1.4k 声望867 粉丝

无论遇到多大的困难,你总是能扛过去,坚持一件事,对自己