flask之current_app的使用及详解

版权声明: https://blog.csdn.net/JENREY/article/details/86606653

【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入栈和出栈,完成了此操作。

猜你喜欢

转载自blog.csdn.net/JENREY/article/details/86606653