flask — как перенаправить вне контекста приложения

#python #http #flask

#python #http #flask

Вопрос:

Я пытаюсь выполнить простое перенаправление из функции, которая не украшена @app decorator, как я могу это сделать (предположительно, мне нужно сделать check_status() осведомленным о контексте приложения)?

 def check_status():
    return redirect("http://google.com")

@dashboard_bp.route('/dashboard')
@login_required
def website_users():
    check_status()
    return render_template('website_users.html')
  

Ответ №1:

Контекст активен во всем мире. Когда вы вызываете check_status() из website_users() , контекст активен.

Не то redirect() , чтобы вызываемый объект нуждался в контексте; все, что он делает, это создает Response() объект, для которого контекст не требуется.

Однако вы игнорируете возвращаемое значение check_status() . Возможно, вам нужно проверить check_status() , возвращает ли что-то:

 status = check_status()
if status is not None:
    # redirect
    return status
  

В качестве альтернативы, check_status() создайте исключение. Вы можете обработать это исключение в своем представлении (и превратить его в ответ перенаправления там), или вы можете зарегистрировать errorhandler() функцию для обработки выделенного исключения:

 class StatusDenied(Exception):
    pass

@app.errorhandler(StatusDenied)
def redirect_on_status_denied(error):
    return redirect("http://google.com")

def check_status():
    raise StatusDenied
  

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

1. В качестве альтернативы, check_status может выдать ошибку (и иметь для нее специальный обработчик ошибок, который выполняет перенаправление).

2. @SeanVieira: Я как раз к этому и подбирался. 🙂

3. Ах да, я действительно игнорировал возвращаемое значение. Мне очень нравится решение, в котором я вызываю ошибку — как я могу адаптировать это для работы в рамках плана действий (у меня нет доступа к @app)? Спасибо.

4. @L-R: используйте Blueprint.errorhandler (so @bprint.errorhandler() ) вместо @app.errorhandler() ) .