我的文件结构是 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
#### 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'),
]
favicon.png
<html>
<head>
{% load staticfiles %}
head>
<body>
[...]
其中,我在 settings.py file 修改的时候, 将 STATICFILES_DIRS
错写成了 STATICFILES_DIR
(少了一个 S
);然后一直有错误,找了好一会儿原因。
目录结构和开头基本一致,除了这个方式使用的是 .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
一步修改即可。
#### 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
的请求。