我正在使用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)
答案 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
。