Flask:核心对象
核心对象里承载了各种各样的功能,比如保存配置信息,再比如注册路由试图函数等
AppContext:对Flask的封装,并且增加了一些额外的参数
Request:保存了请求信息,比如url的参数,url的全路径等信息
RequestContext:对Request的封装
我们在实际编码过程中,可能是需要Flask或者Request的信息的,但是这并不代表我们应该直接导入这两个对象获取相关信息,正确的做法是从AppContext,RequestContext中间接的获得我们需要的信息
即使这样,我们也没有必要导入Context去使用上下文,这就回到了current_app和request这些LocalProxy,他们提供了间接操作上下文对象的能力,使用了代理(LocalProxy)模式
flask工作原理
1、当一个请求进入Flask框架,首先会实例化一个Request Context,这个上下文封装了请求的信息在Request中,并将这个上下文推入到一个栈**(_request_ctx_stack/_app_ctx_strack)**的结构中,即之前将的push方法
2、RequestContext在入**_request_ctx_stack之前,首先会检查_app_ctx_strack是否为空,如果为空,则会把一个AppContext的对象入栈,然后再将这个请求入栈到_request_ctx_stack**中
3、我们的current_app和request对象都是永远指**_app_ctx_strack**/_request_ctx_stack的栈顶元素,也就是分别指向了两个上下文,如果这两个值是空的,那么LocalProxy(代理)就会出现unbound的状态
4、当请求结束的时候,这个请求会出栈-pop
实例化,构造函数的参数会作为Flask app核心对象的标识
app = Flask(name)
from flask import Flask
app = Flask(__name__)
# 通过app.config.from_object导入配置文件
# 配置文件的内容统一要大写,这是一个原则
app.config.from_object('app.secure')
app.config.from_object('app.setting')
registe_blueprint(app)
# 注册LoginManager
login_manager.init_app(app)
cache.init_app(app)#把缓存机制注册到app上
mail.init_app(app)#在app上注册邮箱模块
启动web app
**debug=True:**开启调试模式—>1.修改文件后不用每次都重启服务器 2.可以在网页中显示异常
**host:**可以指定可以访问本网站的ip地址
**port:**启动端口
**threaded:**开启多线程
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run(host="0.0.0.0", port=81, debug=True,threaded=True)
通过导入current_app获取当前app对象,一般用来实现配置文件数据的获取
from flask import current_app
current_app.config['XXX']