flask之current_app的使用及详解

Flask 专栏收录该内容
50 篇文章 5 订阅

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

 

  • 4
    点赞
  • 1
    评论
  • 9
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值