2016-07-18 3 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

관련 문제