【问题标题】:How can I get a favicon to show up in my django app?我怎样才能在我的 django 应用程序中显示一个图标?
【发布时间】:2014-03-23 04:19:11
【问题描述】:

我只想将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,我可以看到网站图标。

【问题讨论】:

  • 错误是GET /favicon.ico 而不是GET /static/favicon.ico 在http://localhost:8000/static/favicon.ico 中查找不相关。看起来有些浏览器请求/favicon.ico 尽管有 HTML。
  • @freezed,同意取决于浏览器。我不喜欢静态的解决方案,我们必须检查所有浏览器的 favicon.ico 框架/协议。

标签: django favicon


【解决方案1】:

如果您有一个随处可见的基本模板或标题模板,为什么不在基本 HTML 中包含网站图标?

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

【讨论】:

  • 听起来是个好主意。你能给我指向一个解释如何做到这一点的链接吗?
  • 是的。比如:{{STATIC_URL}}favicon.ico
  • 这只是一个例子。修改它以满足您的需求。
  • 这个答案对我不起作用,但其他使用 href="{% static 'favicon.ico' %} 的答案对我有用。
  • MIME 类型 (image/png) 和文件格式 (favicon.ico) 不匹配。
【解决方案2】:

一个轻量级技巧是在您的 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),
    ...
]

当您没有真正要托管的其他静态内容时,这可以作为让网站图标正常工作的一个简单技巧。

【讨论】:

  • 与在模板中添加两行相比,我看不出这是多么轻量级。这是一种我不会在生产中使用的技巧。
  • @x-yuri 另一个答案更简单,如果你有一个基本模板。关键是您可能没有任何模板或静态内容,因此甚至可能没有配置 STATIC_URL。例如这是一个 json API。但仍然想要一个可浏览的 API,而不会在您的日志中看到 404 错误(chrome 等将尝试自动请求 favicon.ico)。在生产环境中使用这样的 RedirectView 并没有什么坏处。
  • 不应该像url=settings.STATIC_URL + 'favicon.ico'那样动态构造url='/static/favicon.ico'吗?如果我理解正确,建议的解决方案只有在我们有 STATIC_URL='/static/ 的 settings.py 文件中才能按预期工作。
  • @wim 您将如何应用此方法来重定向许多网站图标格式,以便可以在根目录中访问它们?例如您可能想要提供 10 倍的 Apple Touch 尺寸。
【解决方案3】:

在模板文件中

{% load static %}

然后在&lt;head&gt;标签内

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

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


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

【讨论】:

    【解决方案4】:

    通用解决方案

    您可以像在任何其他框架中一样在 Django 中显示网站图标:只需使用纯 HTML。

    将以下代码添加到 HTML 模板的标题中。
    如果您的应用程序中的 favicon 相同,则最好使用基本 HTML 模板。

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

    前面的代码假设:

    1. 您的静态文件夹中有一个名为“favicon”的文件夹
    2. favicon 文件的名称为“favicon.png”
    3. 您已正确设置设置变量 STATIC_URL

    您可以在 Wikipedia https://en.wikipedia.org/wiki/Favicon 的这篇文章中找到有关文件格式支持以及如何使用网站图标的有用信息。
    我可以推荐使用.png 以获得通用浏览器兼容性。

    编辑:
    正如在一条评论中发布的那样,
    "不要忘记在模板文件的顶部添加{% load staticfiles %}!"

    【讨论】:

    • 提示:favicon.ico 并没有为我做这件事,在使用 .png 扩展名进行测试后它起作用了!
    • 你是对的@kaya。 .ico 格式在兼容性方面并不是最好的。但是 .png 总是有效的。
    • 说找不到文件
    【解决方案5】:

    在您的 settings.py 添加根 staticfiles 目录:

       STATICFILES_DIRS = [
            os.path.join(BASE_DIR, 'static')
            ]
    

    创建/static/images/favicon.ico

    将网站图标添加到您的模板(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')))
    ]
    

    【讨论】:

      【解决方案6】:
      <link rel="shortcut icon" href="{% static 'favicon/favicon.ico' %}"/>
      

      只需像第一个答案一样将其添加到您的基本文件中,但 ico 扩展名并将其添加到静态文件夹中

      【讨论】:

        【解决方案7】:
                <link rel="shortcut icon" type="image/png" href="{% static 'favicon/sample.png' %}" />
        

        同时运行:python manage.py collectstatic

        【讨论】:

          【解决方案8】:

          如果你有权限,那么

          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
          

          【讨论】:

            【解决方案9】:

            我在 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>`.............
            

            项目目录结构

            view live here

            【讨论】:

              【解决方案10】:

              最好的解决方案是覆盖 Django base.html 模板。在 admin 目录下创建另一个 base.html 模板。如果不存在,请先创建一个管理目录。 app/admin/base.html.

              将{% block extrahead %} 添加到覆盖模板。

              {% extends 'admin/base.html' %}
              {% load staticfiles %}
              {% block javascripts %}
                  {{ block.super }}
              <script type="text/javascript" src="{% static 'app/js/action.js' %}"></script>
              
              {% endblock %}
              
              {% block extrahead %}
                  <link rel="shortcut icon" href="{% static 'app/img/favicon.ico'  %}" />
              {% endblock %}
              {% block stylesheets %}
              
                  {{ block.super }}
              {% endblock %}
              

              【讨论】:

                【解决方案11】:

                在寻求帮助时遇到了这个问题。我试图在我的 Django 项目中实现网站图标,但它没有显示——想添加到对话中。

                在我的 Django 项目中尝试实现 favicon 时,我将“favicon.ico”文件重命名为“my_filename.ico”——图像不会显示。重命名为“favicon.ico”后解决了问题并显示了图形。以下是解决我的问题的代码:

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

                【讨论】:

                • 我将我的网站图标直接留在了 static/ 中。事实证明,您需要在 static/ 和图标之间有一个文件夹。现在做你的方法有效!
                【解决方案12】:

                只需将您的网站图标复制到: /yourappname/mainapp(ex:core)/static/mainapp(ex:core)/img

                然后转到您的 mainapp 模板(例如:base.html) 并在 {% load static %} 之后复制它,因为您必须先加载静态数据。

                <link href="{% static 'core/img/favi_x.png' %}" rel="shortcut icon" type="image/png" />
                

                【讨论】:

                  【解决方案13】:

                  现在(2020 年), 您可以在 html 文件中添加基本标记。

                  <head>
                  <base href="https://www.example.com/static/"> 
                  </head>
                  

                  【讨论】:

                    【解决方案14】:

                    最佳做法:

                    与您的想法相反,网站图标可以是任何大小和任何图像类型。 Follow this link for details.

                    不添加指向您的网站图标的链接可能会减慢页面加载速度。

                    在一个 django 项目中,假设你的 favicon 的路径是:

                    myapp/static/icons/favicon.png
                    

                    在您的 django 模板中(最好在基本模板中),将此行添加到页面头部:

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

                    注意:

                    我们假设,静态设置在 settings.py 中配置得很好。

                    【讨论】:

                      猜你喜欢
                      • 2011-07-30
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-08-29
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多