2016-07-18 5 views
2

私はFlaskアプリケーションを設定するためにアプリファクトリパターンを使用しています。私のアプリはFlask-Babel拡張を使用しています。これは工場でも設定されています。しかし、私はそれを使用するために青写真の内線にアクセスしたい、アプリケーションファクトリで定義されているFlask拡張機能にアクセスする

工場は__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変数にアクセスすることはできません。これを解決するにはどうすればいいですか?

答えて

3

フラスコの拡張機能は、このケースのためのアプリインスタンスなしでインスタンス化されるように設計されています。工場外では、拡張機能を定義します。工場内では、init_appに電話して、アプリを拡張機能に関連付けます。

babel = Babel() 

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

babel名前はアプリが作成されているだけでなく後、任意の時点でインポート可能です。


あなたはすでにdb(フラスコSQLAlchemyの)拡張子で正しくこれをやっているように見えます。あなたの具体的なbabel.localeselector例の場合


、それはそこに定義されていますので、babelの隣にそれを置くために多くの意味をなすかもしれません。

+0

main.pyにset_localeを残すことをお勧めしますか? – Sparrowcide

+0

これはあなたの責任とプロジェクトの構成方法です。どのように動作するかには影響しません。とにかくそれは答えの要点ではなく、ちょっとしたメモです。 – davidism

関連する問題