9

アプリ ファクトリ パターンを使用して Flask アプリケーションをセットアップしています。私のアプリは Flask-Babel 拡張機能を使用しており、これも工場でセットアップされています。しかし、それを使用するために設計図で拡張機能にアクセスしたいのですが、

工場は にあり__init__.pyます。

def create_app(object_name):
    app = Flask(__name__)
    app.config.from_object(object_name)

    babel = Babel(app)

    app.register_blueprint(main_blueprint)
    app.register_blueprint(category_blueprint)
    app.register_blueprint(item_blueprint)

    db.init_app(app)
    return app

に以下を追加したいmain.py

@babel.localeselector
def get_locale():
    if 'locale' in session:
        return session['locale']
    return request.accept_languages.best_match(LANGUAGES.keys())

@application.route('/locale/<locale>/', methods=['GET'])
def set_locale(locale):
    session['locale'] = locale
    redirect_to = request.args.get('redirect_to', '/')
    return redirect(redirect_to)     # Change this to previous url

残念ながら、アプリケーション ファクトリから変数main.pyにアクセスすることはできません。babelこれを解決するにはどうすればよいですか?

4

1 に答える 1

13

Flask 拡張機能は、まさにこの場合のアプリ インスタンスなしでインスタンス化されるように設計されています。ファクトリの外で、拡張機能を定義します。ファクトリ内でinit_app、アプリを拡張機能に関連付けるために呼び出します。

babel = Babel()

def create_app():
    ...
    babel.init_app(app)
    ...

babelアプリの作成後だけでなく、いつでも名前をインポートできるようになりました。


db(Flask-SQLAlchemy) 拡張機能を使用して、これを正しく行っているようです。


あなたの特定の例の場合、そこで定義されているので、それbabel.localeselectorを横に置く方が理にかなっているかもしれません。babel

于 2016-07-18T18:54:26.973 に答える