Ошибка 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 на корневом уровне - даже если они пусты. Это позволяет избежать проблем , таких как, и других ненужных ошибок, которые добавляют шум в журналы.