Использовать переменную flask вне контекста

#python #flask #blueprint

#python #flask #схема

Вопрос:

В приложении Flask (инициализированном в __init__.py ) У меня есть два чертежа — auth и main . В auth проекте я пытаюсь установить некоторую переменную (будет загружена из БД и зависит от current_user.get_id() ), которая должна использоваться в main проекте в качестве URL-префикса:

auth.py

 @auth.route('/login', methods=['POST'])
def login_post():
    username = request.form.get('username')
    password = request.form.get('password')

    user_inst = user.query.filter_by(username=username).first()


    if not user_inst or not check_password_hash(user_inst.password, password):
        flash('Invalid credentials. Check you input and try again.')
        return redirect(url_for('auth.login')) 

    login_user(user_inst)
    
    g.team_name = 'some_team_name'
    #session['team_name'] = 'some_team_name'
    
    # if the above check passes, then we know the user has the right credentials
    return redirect(url_for('main.some_func'))
 

В основном плане это необходимо для получения team_name переменной:

 main = Blueprint('main', __name__, static_folder="static", static_url_path="", url_prefix=g.team_name)
 

Не могли бы вы, пожалуйста, посоветовать, есть ли правильный способ импортировать переменную из auth в main (до ее инициализации) без получения:

 RuntimeError: Working outside of application context.
 

Ответ №1:

Основным решением вашей проблемы является регистрация элементов внутри app.app_context():

И похоже, что это ваш первый проект flask, и это распространенная проблема, связанная со структурой проекта. Прочитайте о шаблоне фабрики приложений Flask и примените его.

your_app/__init__.py

 def create_app(app_config):
    app = Flask(__name__)
    with app.app_context():
        from your_app.somewhere import team_name

        app.register_blueprint(team_name)
    return app
 

Комментарии:

1. Потрясающе! Большое спасибо!

2. еще один совет: найдите в открытых репозиториях github flask create_app и просто скопируйте дизайн проекта))