#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()
) .