app的引用问题
tcsnszh97 opened this issue · comments
你好,向你请教个问题。
我是根据miguelgrinberg写的书学习写flask的。
书中为了在蓝本中实现程序功能,将app的注册放在了create_app函数里
app/main/init.py:
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
bootstrap.init_app(app)
mail.init_app(app)
moment.init_app(app)
db.init_app(app)
login_manager.init_app(app)
pagedown.init_app(app)
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint, url_prefix='/auth')
from .api_1_0 import api as api_1_0_blueprint
app.register_blueprint(api_1_0_blueprint, url_prefix='/api/v1.0')
return app
所以我在models里是通过
from . import create_app
app=create_app('default')
来获取app的,而不是通过from app import app
导入的。
app/models.py:
#...
app = create_app('default')
class Book(db.Model):
__tablename__ = 'books'
__searchable__ = ['bookname','author','ISBN']
id = db.Column(db.Integer, primary_key=True)
bookname = app.db.Column(app.db.String(64))
author = app.db.Column(app.db.String(64))
press = db.Column(db.String(64))
ISBN = app.db.Column(app.db.String(64), primary_key=True)
published_date = db.Column(db.Date)
lends = db.relationship('Lend', backref='book', lazy='dynamic')
但是如果app = create_app('default')写在class Book前就会出现
ImportError: cannot import name 'Book'
这个错误,我猜测是循环导入依赖导致的问题,所以可能要放在class Book后,但是如果写在后面,class中的bookname = app.db.Column(app.db.String(64))
又引用不了app,
NameError: name 'app' is not defined
所以现在我也不知道应该怎么办。
python所学尚浅,还望你能帮我看一下我出现了什么问题。
可能表述不清楚,如果有帮助的话代码在这。
https://github.com/tcsnszh97/szuprojects/tree/master/flasky
另请问一下WHOOSH_BASE = os.path.join(basedir, 'search.db')
里的search.db是什么意思,一开始我以为是自己数据库的名字,但是后来发现文档里好像创建了一个search.db的文件夹,所以不是很清楚这里的文件夹是什么。
祝生活愉快。
使用的问题解决了,但是查找数据还是失败了,查到的都是空的,请问支持Mysql吗,WHOOSH_BASE要怎么设置呢。
WHOOSH_BASE 是存放索引的文件夹,和你的数据库没有关系。
Flask-WhooshAlchemyPlus 是只依赖于 flask, whoosh 还有 sqlalchemy 的,所以 sqlalchemy 支持的数据库这个插件都支持,当然 mysql 也包含在内
查找数据失败有很多原因,最常见的就是你没有索引,可以参考这里 https://github.com/Revolution1/Flask-WhooshAlchemyPlus#manually-indexing
另外不要在其他地方实例化 app,这会出很多问题,不只是循环引用。
你需要开启SQLALCHEMY_TRACK_MODIFICATIONS=True