Ошибка Flask.url_for(): попытка создать URL-адрес без нажатия на контекст приложения
У меня есть тривиальное приложение, в котором я пытаюсь перенаправить значок для:
http://flask.pocoo.org/docs/0.10/patterns/favicon/
app = flask.Flask(__name__)
app.add_url_rule('/favicon.ico', redirect_to=flask.url_for('static', filename='favicon.ico'))
Но это не удается:
RuntimeError: Attempted to generate a URL without the application context being pushed. This has to be executed when application context is available.
Итак, угадывая, я пробую это:
app = flask.Flask(__name__)
with app.app_context():
flask.current_app.add_url_rule('/favicon.ico', redirect_to=flask.url_for('static', filename='favicon.ico'))
Но получите другую ошибку:
RuntimeError: Application was not able to create a URL adapter for request independent URL generation. You might be able to fix this by setting the SERVER_NAME config variable.
Что происходит?
Ответы
Ответ 1
Согласно документу:
Установка SERVER_NAME также по умолчанию позволяет создавать URL-адреса без контекста запроса, но с контекстом приложения.
поскольку вы используете app_context
, вы можете установить значение конфигурации SERVER_NAME
.
Кстати, как сказано в документе: добавление значка :
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
приведенной выше строки должно быть достаточно для большинства браузеров, нам не нужно делать никаких других вещей.
Ответ 2
Поздний ответ, я просто столкнулся с той же проблемой. Вместо этого я не вижу большого недостатка в обработке перенаправления:
@app.route('/favicon.ico')
def favicon():
return redirect(url_for('static', filename='favicon.ico'))
Это предотвращает вызов url_for до того, как приложение будет готово.
Чтобы противопоставить использование ссылки только в HTML, для каждого сайта рекомендуется иметь favicon.ico и robots.txt на корневом уровне - даже если они пусты. Это позволяет избежать проблем , таких как, и других ненужных ошибок, которые добавляют шум в журналы.