Flask.url_for()错误:尝试生成没有推送应用程序上下文的URL

时间:2015-08-01 20:45:42

标签: flask

我有一个简单的应用程序,我正在尝试重定向favicon每个:

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.

发生了什么事?

3 个答案:

答案 0 :(得分:14)

根据doc

  

默认情况下,设置SERVER_NAME也可以在没有请求上下文但具有应用程序上下文的情况下生成URL。

由于您使用的是app_context,因此您可以设置SERVER_NAME配置值。

顺便说一句,正如doc:Adding a favicon所说:

<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">

对于大多数浏览器而言,上述行应该足够了,我们不必做任何其他事情。

答案 1 :(得分:1)

最新答案,我遇到了同样的问题。在处理这样的重定向时,我没有看到太大的缺点:

@app.route('/favicon.ico')
def favicon():
    return redirect(url_for('static', filename='favicon.ico'))

这可以防止在应用程序准备就绪之前调用url_for。

要避免仅在HTML中使用链接,对每个站点来说,在根目录级别都具有favicon.ico和robots.txt是一个好习惯-即使它们为空。它避免了问题like this和其他不必要的错误,这些错误会给日志增加噪音。

答案 2 :(得分:1)

不要将其放在应用程序中,而是放在html文件中

null