Flask上下文介绍

在程序中我们所写的函数大都不是单独完整的,在使用一个函数完成自身功能的时候,很可能需要同其他的部分进行交互,需要其他外部变量的支持,上下文就是给外部的变量赋值,使函数能正确运行。

Flask 提供了两种上下文,一种是应用上下文(Application Context),一种是请求上下文(Request Context)。

应用上下文和请求上下文都是存放到一个 LocalStack 的栈中的,在应用运行时框架底层会在每个请求进入的时候将请求上下文和应用上下文都推入栈中,因此,在视图函数中,不用担心上下文的问题。

那么不是视图函数的函数(也就是请求之外的函数)要使用如 current_app、request、url_for、app 配置项等依赖上下文的对象时会发生什么呢?当然是报错:

1
2
... outside of application context
... outside of request context

这时,我们就需要手动将上下文推入到栈中。

推入请求上下文到栈中时,会自动首先判断有没有应用上下文,如果没有则会先推入应用上下文到栈中,然后再推入请求上下文到栈中。

1
2
with app.test_request_context():
   print(current_app)

推入应用上下文到栈中:

1
2
with app.app_context():
   print(current_app)