一. flask中的经典错误
我们现在工程中新建test/test1.py:
from flask import Flask, current_app
app = Flask(__name__)
a = current_app # 如果调试, 这里会出现unbund未绑定
d = current_app.config['DEBUG']
运行test/test1.py,出现如下报错,: RuntimeError: Working outside of application context.
1.以前使用flask的request也出现过类似错误
2.我们在app/spider/yushu_book.py中使用过` current_app.config['PER_PAGE']`,为什么没有报错?
我们查看current_app的源码:
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, request, session, g都使用了LocalProxy, 这也是产生错误的原因所在。
二. AppContext、RequestContext、 Flask与Request之间的关系
AppContext应用上下文,其实是对Flask以及Flask外部一些其他内容的封装。
RequestCont请求上下文,同样的是对Request以及Request外部内容的封装
我们编码时,真正要使用的是Flask或Request对象,
但使用时必须从AppContext,RequestContext两个上下文中获取。
而LocalProxy代理,提供了访问Flask和Request的能力
三. 详解flask上下文与出入栈
flask运行的流程图:
1.请求进入时, 检测_app_ctx_stack栈中有没有app, 没有的话push推入
2