核心知识
- AppContext手动、自动入栈
- LocalStack是线程隔离的栈结构
- current_app是线程、协程隔离对象
- LocalProxy是获取当前线程隔离的代理对象
flask中经典错误 working outside application context
错误:
working outside application contex
原因:
在没有获取到应用上下文的情况下,进行了上下文操作。
代码:
from flask import Flask, current_app
app = Flask(__name__)
a = current_app
d = current_app.config['DEBUG']
运行:
AppContext、RequestContext、Flask与Request之间的关系
- AppContext
应用上下文,是对flask一切对象的封装 - RequestContext
请求上下文,是对request请求对象的封装 - current_app
类型是LocalProxy
像全局变量一样工作,但只能在处理请求期间且在处理它的线程中访问
返回的栈顶元素不是应用上下文,而是flask的应用实例对象
应用上下文的封装=flask核心对象+和外部协作对象(再flask封装对象上再添加push、pop等)(请求上下文同理)
代码:
F12进入current_app
# context locals
_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object, 'request'))
session = LocalProxy(partial(_lookup_req_object, 'session'))
g = LocalProxy(partial(_lookup_app_object, 'g'))
current_app与reques:
current_app和reques都是设计模式中代理设计的代理对象,指向flask核心对象和reques的请求类
详解flask上下文与出入栈
在pycharm的flask项目中可以通过:
External Libraries->site-packages->flask->ctx.py</