使用应用工厂模式时初始化Flask-WhooshAlchemy索引

时间:2016-09-13 12:23:11

标签: python flask

我正在使用application factory pattern使用Flask开发应用。初始化Whoosh索引不起作用,因为如果没有明确设置应用程序上下文,则无法使用current_app。我该怎么做?

__init__.py

from flask import Flask
from .frontend import frontend

def create_app(configfile=None):
    app = Flask(__name__)

    from .models import db
    db.init_app(app)

    app.register_blueprint(frontend)

    return app

models.py

from flask_sqlalchemy import SQLAlchemy
import flask_whooshalchemy as wa
from flask import current_app

db = SQLAlchemy()

class Institution(db.Model):
    __searchable__ = ['name', 'description']
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40))
    description = db.Column(db.Text)

# this does not work
wa.whoosh_index(current_app, Institution)

1 个答案:

答案 0 :(得分:0)

You can't use current_app outside an application context.在请求期间或使用app.app_context()明确创建时,应用程序上下文存在。

create_app期间导入模型,并在那里使用Whoosh对其进行索引。请记住,工厂是您为应用程序执行所有设置的地方。

def create_app():
    app = Flask('myapp')
    ...
    from myapp.models import Institution
    wa.whoosh_index(app, Institution)
    ...
    return app

如果您希望将代码保留在蓝图的本地,则可以使用蓝图的record_once函数在应用程序上注册蓝图时执行索引。

@bp.record_once
def record_once(state):
    wa.whoosh_index(state.app, Institution)

在使用应用程序注册蓝图时,最多会调用一次。 state包含应用,因此您不需要current_app