参考连接:https://blog.youkuaiyun.com/m0_37519490/article/details/81260395
找了许多都没看明白,下面是自己的理解,不对的地方请留言指正。其实翻译成上下文会对我们的理解有很大的困扰,因为总是感觉上下文是和当前所处的函数有关。真正的还是和flask访问机制有关
Flask提供了两种上下文,一种是应用(Application Context),一种是请求(Request Context)。
问题1,为什么提供上下文?
要从flask实现机制来说,如下图
上图说明:Appcontext封装了应用上下文,Requestcontext封装了请求上下文。current_app和request其实都是操作栈顶元素
流程:当一个请求进入flask框架的时候会首先实例化一个Requestcontext请求,请求的信息封装在Request里面
然后将请求推入request_ctx_stock栈中,在推入之前会检查app_ctx_stock栈顶元素,如果 栈顶为空或者不是当前对象,flask会把一个AppContext推入栈中。接着将请求推入request_ctx_stock栈中,等项目结束后,会自动弹出
所以当实现一个flask项目,正常的用浏览器去访问的时候,就会触发这个机制,flask会自动的将一个AppContext推入栈中,重而使用current_app不会出现
如果测试的时候,单独测试某一单元,flask就不会触发自动推入机制,就出现该错误。(因为栈中没有对象)
综上为什么出现上下文,其实就是flask的访问机制原理,和我们想的上下文没有是丝毫联系。当自己进行测试某个单元模块时,没有建立请求,就会用到自己手动将appcontext推入栈中。下面讲述的就是解决方法
出现上述错误如何解决,flask为我们提供了解决方法,但是根据博客https://blog.youkuaiyun.com/m0_37519490/article/details/81260395 所讲手动推入和推出很好的理解了这个机制
官方给出的解决方法: