如何让我的Django应用程序显示网站图标?

211

我只想将 favicon.ico 放在我的 staticfiles 目录中,并且让它在我的应用程序中显示。

我该如何实现这个目标?

我已经将 favicon.ico 文件放在了我的 staticfiles 目录中,但是它并没有显示出来,并且我在日志中看到了这个信息:

127.0.0.1 - - [21/Feb/2014 10:10:53] "GET /favicon.ico HTTP/1.1" 404 -

如果我访问 http://localhost:8000/static/favicon.ico,我可以看到网站图标。

9
错误是 GET /favicon.ico 而不是 GET /static/favicon.ico,查看 http://localhost:8000/static/favicon.ico 与此无关。看起来一些浏览器会在 HTML 中没有指定时请求 /favicon.ico - freezed
@freezed,同意取决于浏览器。我不喜欢使用静态解决方案,我们必须检查所有浏览器的favicon.ico框架/协议。 - NegaOverflow
1
这是一个完整的教程:https://learndjango.com/tutorials/django-favicon-tutorial - Sunchock
21个回答

232
如果您有一个在各处都包含的基础或头部模板,为什么不使用基本的HTML在那里包含网站图标呢?
<link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}"/>

3
听起来是个好主意。你能给我提供一个链接,解释如何操作吗? - tadasajon
3
是的。类似这样:{{STATIC_URL}}favicon.ico - karthikr
18
这只是一个例子,根据你的需求进行修改。 - hanleyhansen
3
对我来说这个答案不起作用,但是其他使用href="{% static 'favicon.ico' %}的答案可以。 - Bezewy
7
MIME类型(image/png)与文件格式(favicon.ico)不匹配。 - x-yuri
显示剩余7条评论

158

一种轻量级的技巧是在您的urls.py文件中进行重定向,例如添加以下视图:

from django.views.generic.base import RedirectView

favicon_view = RedirectView.as_view(url='/static/favicon.ico', permanent=True)

urlpatterns = [
    ...
    re_path(r'^favicon\.ico$', favicon_view),
    ...
]

当您没有其他静态内容可供托管时,这是一种很好的获取网站图标工作的简单技巧。


3
与在模板中添加两行相比,我不认为这个轻量级。而且这种技巧在生产环境中我也不会使用。 - x-yuri
27
如果您有一个基本模板,那么另一个答案更容易。重点是您可能没有任何模板或静态内容,因此STATIC_URL甚至可能未配置。例如,它可能是一个JSON API。但仍然希望一个可浏览的API,而不在日志中看到404错误(Chrome等会自动尝试请求favicon.ico)。在生产中使用RedirectView没有任何危害。 - wim
url='/static/favicon.ico' 这样的 URL 是否应该动态构建,就像 url=settings.STATIC_URL + 'favicon.ico' 一样?如果我理解正确,所提出的解决方案只有在 settings.py 文件中有 STATIC_URL='/static/ 时才能按预期工作。 - Rabarberski
@wim,您如何应用此方法来重定向多个网站图标格式,以便它们可以在根目录中访问?例如,您可能有10个苹果触摸尺寸需要提供。 - alias51
这实际上是一个很好的答案,因为一些浏览器会查找 /favicon.ico,而不管在 html 文件中声明了什么。 - Herman Martinus

71

在模板文件中

{% load static %}

然后在<head>标签中

<link rel="shortcut icon" href="{%  static 'favicon.ico' %}">

这假设您在settings.py中适当配置了静态文件。


注意:Django的旧版本使用load staticfiles,而不是load static


39

通用解决方案

你可以像在其他框架中一样,在Django中使用纯HTML来显示favicon。

将以下代码添加到您的HTML模板的头部。
更好的做法是将其添加到基本HTML模板中,如果favicon在整个应用程序中都相同。

<link rel="shortcut icon" href="{% static 'favicon/favicon.png' %}"/>

先前的代码假设:

  1. 您在静态文件夹中有一个名为“favicon”的文件夹
  2. 网站图标文件的名称为“favicon.png”
  3. 您已经正确地设置了静态文件夹的STATIC_URL变量

您可以在维基百科的这篇文章中找到关于文件格式支持和如何使用网站图标的有用信息:https://en.wikipedia.org/wiki/Favicon
我建议使用.png以实现通用浏览器兼容性。

编辑:
如一条评论所述,
“不要忘记在模板文件的顶部添加{% load staticfiles %}!”


1
提示:对我来说,favicon.ico没有起作用,在使用.png扩展名进行测试后,它起作用了! - kaya
你说得对@kaya。关于兼容性,.ico格式并不是最好的选择。然而.png格式总是可用的。 - ePi272314
1
文件未找到。 - Kashif Iftikhar

39
在你的settings.py文件中添加一个根静态文件目录:
   STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
        ]

创建/static/images/favicon.ico

将favicon添加到您的模板(base.html)中:

{% load static %}
<link rel="shortcut icon" type="image/png" href="{% static 'images/favicon.ico' %}"/>

urls.py中创建一个URL重定向,因为浏览器会在/favicon.ico中查找收藏夹图标。

from django.contrib.staticfiles.storage import staticfiles_storage
from django.views.generic.base import RedirectView

urlpatterns = [
    ...
    path('favicon.ico', RedirectView.as_view(url=staticfiles_storage.url('images/favicon.ico')))
]

嘿,这似乎是我显示网站图标的唯一方法 - 所以谢谢。但我仍然不明白几件事情。1:我似乎不需要更改base.html - 网站图标可以正常工作。2:urls.py更改似乎至关重要,但我不明白为什么我必须这样做。难道不应该由Web服务器提供文件吗?这就是我们需要执行collectstatic的原因,对吧? - callmebob
1: 因为如果在HTML中未声明favicon,不是所有浏览器都能找到它。 2: 如答案所述,现代浏览器会在该URL中查找favicon。 - Mustapha-Belkacim

12

第一步

将您的favicon.ico上传到应用程序静态路径或在settings.py中通过STATICFILES_DIRS配置的路径

第二步

在应用程序基础模板文件中:

{% load static %}
<link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}"/>

在这里,您可以让应用程序使用不同的 favicon.ico 文件。

补充

在 project/urls.py 中。

from django.templatetags.static import static # Not from django.conf.urls.static 
from django.views.generic.base import RedirectView
将此路径添加到您的urlpatterns基础位置。
path('favicon.ico', RedirectView.as_view(url=static('favicon.ico'))),

这可以让安装的应用程序(例如管理员,您不应更改模板)和您忘记修改模板的应用程序,也显示默认的 favicon.ico。


10
<link rel="shortcut icon" href="{% static 'favicon/favicon.ico' %}"/>

像第一个回答一样,在您的基础文件中添加ico扩展名并将其添加到静态文件夹中。


6

我尝试在Django 2.1.1中使用以下设置

base.html

<head>
  {% load static %}
  <link rel="shortcut icon" type="image/png" href="{% static 'images/favicon.ico' %}"/>
</head>

settings.py

 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
 STATIC_URL = '/static/'` <br>`.............

项目目录结构

图片

点击此处查看实时网页


6

如果您有权限,则执行以下操作:

Alias /favicon.ico /var/www/aktel/workspace1/PyBot/PyBot/static/favicon.ico

在您的虚拟主机中添加别名(在Apache配置文件中),同样适用于robots.txt。
Alias /robots.txt /var/www/---your path ---/PyBot/robots.txt

6
        <link rel="shortcut icon" type="image/png" href="{% static 'favicon/sample.png' %}" />

另外要运行:python manage.py collectstatic


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接