Ошибка Flask.url_for (): Попытка создать URL-адрес без нажатия контекста приложения

#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. В связанной статье документа подробно описывается, почему, тем не менее, может потребоваться добавить такое перенаправление.