为Flask应用添加favicon

Wed 01 October 2014 / In categories Server Stack

Flask

Flask是一个基于Python可扩展的微型Web框架。

前面一篇文章介绍了网站标配favicon.ico和robots.txt,这篇文章介绍如何在Flask中添加favicon.ico的支持(参考Flask的文档

网站需要设置独立的favicon.ico作为图形标志,对于Flask这样动态的Web应用来说,favicon.ico是存放在一个单独的文件夹/static/下面的。 那么如何让浏览器知道favicon.ico的存放位置呢?

有几种方式,第一种是在渲染HTML时添加:

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

浏览器会聪明地从HTML中获取favicon.ico的地址。但是对一些老式不灵光的HTML浏览器,这个不管用,默认情况下这些浏览器还是会去读取URL地址/favicon.ico

第二种方式是在Flask中设置一条动态的route到URL地址/favicon.ico,浏览器访问这个URL时,会被指引到favicon.ico真正的位置:

app.add_url_rule('/favicon.ico',
                 redirect_to=url_for('static', filename='favicon.ico'))

跳转会降低响应速度,第三种方式直接发送favicon文件的内容:

import os
from flask import send_from_directory

@app.route('/favicon.ico')
def favicon():
    return send_from_directory(os.path.join(app.root_path, 'static'),
                               'favicon.ico', mimetype='image/vnd.microsoft.icon')

上面两种方式都是在Flask中进行动态跳转,但是更好的做法是使用Web服务器的支持。例如,Openshift上运行Python时,可以在wsgi目录下的.htaccess中添加URL改写规则:

RewriteEngine On
RewriteRule ^application/favicon.ico /static/favicon.ico  [L]
Load Disqus Comments