from flask import Flask
from kirin_app.kirin_web.book.view import blueprint_web
from kirin_app.models.database.db_book import db
app = Flask(__name__)
#配置文件必须放app创建完毕后的第一个位置,后续的挂在都是依赖配置文件来执行的!
# 把配置文件转换成一个dict字典对象
# 公开的信息的配置文件
app.config.from_object("kirin_app.config.settings")
#私有不能公开的信息的配置文件
app.config.from_object("kirin_app.config.secure")
#在app上注册一个blueprint_web蓝图
app.register_blueprint(blueprint_web)
#db数据库挂在到app对象上
db.init_app(app)
#创建所有的数据库表(推荐这种做法)
db.create_all(app=app)
/**
#另外一种create_all()不传值,但是让current_app有值的情况
with app.app_context():
#手动推入APPcontext上下文,这样current_app就有值了!
db.create_all()
**/
db.create_all方法要不要传app对象进入,我们查看官方源代码可以得知!
1、如果使用db.init_app(app)来挂载数据库,那么必须使用db.create_all(app=app),把app对象当做参数传入才能创建表成功!
原因是:init_app函数并没有把app对象保存在SQLAlchemy属性中,用完就不管了,可以查看源代码!(当然,特殊情况,在最下面一张图中,如果current_app存在的话,不传也可以,但是current_app必须手动推入上下文用with语句)