#python #flask #url-for
Вопрос:
У меня есть тривиальное приложение, в котором я пытаюсь перенаправить значок на:
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:
Согласно документу:
Установка ИМЕНИ СЕРВЕРА также по умолчанию позволяет создавать URL-адреса без контекста запроса, но с контекстом приложения.
поскольку вы используете app_context
, вы можете задать значение SERVER_NAME
конфигурации.
Кстати, как говорится в документе:Добавление фавикона:
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
приведенной выше строки должно быть достаточно для большинства браузеров, нам не нужно делать никаких других вещей.
Комментарии:
1. Что делать, если я хотел бы иметь значок без рендеринга html-шаблона? Скажем, на классическом примере «привет, мир».
2. В документах также предлагается добавить
app.add_url_rule
в соответствии с вопросом для учетной записи для старых браузеров
Ответ №2:
Поздний ответ, я только что столкнулся с той же проблемой. Я не вижу большого недостатка в том, чтобы вместо этого обрабатывать перенаправление подобным образом:
@app.route('/favicon.ico')
def favicon():
return redirect(url_for('static', filename='favicon.ico'))
Это предотвращает вызов url_for до того, как приложение будет готово.
Чтобы противопоставить использование ссылки только в HTML, рекомендуется, чтобы у каждого сайта был свой фавикон.ico и robots.txt на корневом уровне — даже если они пусты. Это позволяет избежать подобных проблем и других ненужных ошибок, которые создают шум в журналах.
Комментарии:
1. В документах предлагается использовать
send_from_directory
, а неredirect
Ответ №3:
Не помещайте это в приложение, а в html-файл
<html lang="en">
<head>
<title>{{ title }}</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width/2, initial-scale=1">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
Комментарии:
1. Хороший ответ, за исключением того, что ОП ищет фавикон:
<link rel="shortcut icon" href="{{ url_for('static', filename='img/favicon.ico') }}" type="image/x-icon">
2. В связанной статье документа подробно описывается, почему, тем не менее, может потребоваться добавить такое перенаправление.