Django "GET /static/favicon.png HTTP/1.1" 404 1657

解决 Django Server - Chrome 请求 favicon.ico 404 问题

  • 解决 Django Server - Chrome 请求 favicon.ico 404 问题
    • 1 文件结构
    • 2 修改代码使 可以获取到 favicon.png
      • 2.1 配置 Django Server 静态文件夹
      • 2.2 请求的 url 指示加载 `favicon.png`
      • Note
    • 3 一个可能是更好的解决方案
      • 3.1 目录结构
      • 3.2 Solution
    • Reference

1 文件结构

我的文件结构是 fallow 官方 Tutorial 做的 Polls

mysite/ $ tree -L 2
.
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── polls
│   ├── apps.py
│   ├── urls.py
│   ├── ...一些不那么重要的文件...
│   └── views.py
└── static
    └── favicon.png

7 directories, 15 files

2 修改代码使 可以获取到 favicon.png

2.1 配置 Django Server 静态文件夹

#### filename: mysite/mysite/settings.py

[...]
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

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

2.2 请求的 url 指示加载 favicon.png


<html>
<head>
	{% load staticfiles %}
	
head>
<body>
[...]

Note

其中,我在 settings.py file 修改的时候, 将 STATICFILES_DIRS 错写成了 STATICFILES_DIR (少了一个 S);然后一直有错误,找了好一会儿原因。

3 一个可能是更好的解决方案

3.1 目录结构

目录结构和开头基本一致,除了这个方式使用的是 .ico 的 favicon 文件,而非 .png
差别的文件结构如下:

./
├ ...
|
└── static
    ├── favicon.png
    └── favicon.ico

可以看到,这里为其增加了一个 .ico 文件格式的 favicon.ico 文件。

重要
本节 3 一个可能是更好的解决方案 是基于 2 修改代码使 可以获取到 favicon.png 节中的配置继续。
即,除了 1. 需要有一个 static 文件夹以及 favicon.ico 文件之外;
还需要 2. 按照上面一样的 settings.py 文件配置。
最后,总结本节一共有三步配置,除了这里两步之外,只剩下以下 3.2 Solution 一步修改即可。

3.2 Solution

#### mysite/mysite/urls.py
[...]
from django.views.generic.base import RedirectView

urlpatterns = [
    path('admin/', admin.site.urls),
    [...]
    path(r'favicon.ico',
         RedirectView.as_view(url=r'/static/favicon.ico')),
]

注意上面的 [...] 表示代码省略。
上面代码开发指示了这段代码所在文件位置。

从 Django 的 runserver log 我们可以看到,浏览器自动请求的 favicon.ico 在站点的根路径。
而 Django Server 代理的所有静态文件是归到 /static/ 站点路径下的。

也就是说,请求 站点 + /static/ + any-file 这样的路径,因为其中的 any-file 是在 /static/ 路径下,所以 Django 都会以浏览器是请求静态文件的方式来处理它。
而之所以是 /static/ 路径被 django 当作是静态文件的放置路径,是因为这在 settings.py 中已经默认配置好了。

settings.py 在(截至2019/03)默认没有任何改动的情况下,最后一行就是该配置。

所以上面的代码为请求根路径下的 favicon.ico 重定向到请求 /static/ 路径下的 favicon.ico,而当浏览器重定向请求 /static/favicon.ico 时,django server 通过默认的响应静态文件方式,直接发送该静态文件给浏览器。

至此就完成了浏览器对 favicon.ico 的请求。


Reference

  1. 这里提供一个我从网上下载的 png 作为“polls” 网站的图标的链接: 点我下载

你可能感兴趣的:(#,Python,#,Django)