本文仅为作者自学之用,系统为macOS,不保证信息准确。
Flask的上下文使用
写惯了java或者python等oo语言的同学也许会烦恼为什么在flask的主文件中不能给app = Flask(__name__)
添加成员变量或者初始化函数呢?我也好奇这个问题,同时也很希望可以解决这个需求,可惜并无所获。没有办法写成成员变量以及初始化函数就导致了一个问题,那就是web.py这个程序中如果需要实例化某些类就需要写在最外层,系统一经启动就会开始运行,这样会带来诸多的问题:
- 被初始化的类中若用到了
from flask import current_app
这样的操作便会报错,因为初始化这个类的时候还并没有真正开启这个app,所以current_app
便会找不到。这是程序中一个常见的错误类型,A初始化中需要实例化B,B初始化中又需要实例化A,互相依赖。 - 如果需要在开启服务器的时候同时启动新进程运行后台程序,(例如开启一个程序从数据库查询是否有新数据,有的话就抓取并处理;或者是定时任务等)则会在服务还未完全开启时就开始,会在某些情况下导致服务器不存在,定时任务失败等错误。
这里提出的解决方案仅能解决第一种情况,第二种情况如果以后发现了解决方案也会补上。
这里就要用到app.app_context()
了。
app = Flask(__name__)
with app.app_context():
db = Database()
re = db.get_redis()
conn = db.get_mongo()
config = Config()
在with app.app_context():
语句下,即便服务还未真正的跑起来,却已经有了app实例了,在这里以app实例以某种方式传入其下的类初始化函数中可以解决这些类中无法读取current_app
的问题,从而代码可以正确执行。