Revolution1 / Flask-WhooshAlchemyPlus

Whoosh indexing capabilities for Flask-SQLAlchemy, Flask-WhooshAlchemy plus some improvement
Other
68 stars 17 forks source link

app的引用问题 #9

Closed tcsnszh97 closed 6 years ago

tcsnszh97 commented 7 years ago

你好,向你请教个问题。 我是根据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的文件夹,所以不是很清楚这里的文件夹是什么。

祝生活愉快。

tcsnszh97 commented 7 years ago

使用的问题解决了,但是查找数据还是失败了,查到的都是空的,请问支持Mysql吗,WHOOSH_BASE要怎么设置呢。

Revolution1 commented 7 years ago

WHOOSH_BASE 是存放索引的文件夹,和你的数据库没有关系。

Flask-WhooshAlchemyPlus 是只依赖于 flask, whoosh 还有 sqlalchemy 的,所以 sqlalchemy 支持的数据库这个插件都支持,当然 mysql 也包含在内

查找数据失败有很多原因,最常见的就是你没有索引,可以参考这里 https://github.com/Revolution1/Flask-WhooshAlchemyPlus#manually-indexing

Revolution1 commented 7 years ago

另外不要在其他地方实例化 app,这会出很多问题,不只是循环引用。

halcyon370 commented 7 years ago

你需要开启SQLALCHEMY_TRACK_MODIFICATIONS=True