Рассмотрим это view
, которое генерирует ico
изображение:
from django.http import HttpResponse
from app.somewhere import Favicon
# View URL: `/<str:colour>.ico`
def favicon( request, colour ):
response = HttpResponse(
Favicon.render( colour ),
status=200
)
response['Content-Type'] = 'image/x-icon'
response['Cache-Control'] = 'public, max-age=31536000'
return response
Favicon.render()
возвращает допустимый поток байтов, не обращайте на это внимания.
Вот элемент link
в head
моего HTML-документа:
<link rel=icon href=/7f9fa4.ico>
Теперь возникает вопрос: почему каждый раз, когда я перезагружаю страницу, мой браузер Хром 73 делает запрос к /7f9fa4.ico
, а не извлекает иконку из кеша? Если я открою /7f9fa4.ico
в новой вкладке, первый раз будет отправлен запрос на сервер, далее мой браузер будет извлекать изображение из кеша; теперь скажите мне, что не так с системой кэширования браузера.
Вот запрос (файлы cookie и настройки опущены):
GET /7f9fa4.ico HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
Referer: http://localhost:8000/
А это заголовки ответа:
HTTP/1.1 200 OK
Date: Mon, 03 Jun 2019 07:03:58 GMT
Server: WSGIServer/0.2 CPython/3.6.8
Content-Type: image/x-icon
Cache-Control: public, max-age=31536000
X-Frame-Options: SAMEORIGIN
Content-Length: 196
Вывод в консоль (если это как-то может помочь):
[05/Jun/2019 09:17:42] "GET /7f9fa4.ico HTTP/1.1" 200 196
Кроме того, если я удалю элемент link
из head
, браузер будет делать запросы к /favicon.ico
(что в моем случае просто отражает /ffffff.ico
) каждый раз, когда я перезагружаю страницу с тем же эффектом.
@SergeyMiletskiy без обид, но если бы решение было таким простым, я бы сам его сделал. Я пробовал - никаких результатов.
ничего личного, это просто процесс развития. :) Моя следующая идея - вы запускаете свой сервер в режиме DEBUG, поэтому статическая подача отличается. Попробуйте установить DEBUG=False
@SergeyMiletskiy до сих пор не действует.
Вы можете обнаружить, что этот запрос выполняется для проверки кэшированного содержимого. Я заметил, что запрос, который вы отправили на сервер, имеет Cache-Control: no-cache
и Pragma: no-cache
.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#Cacheability
no-cache Forces caches to submit the request to the origin server for validation before releasing a cached copy.
Таким образом, он заставляет кеши отправлять запрос на проверку.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Pragma#Directives
no-cache Same as Cache-Control: no-cache. Forces caches to submit the request to the origin server for validation before releasing a cached copy.
В них говорится, что браузер должен отправить запрос на ваш сервер для «проверки», прежде чем использовать значок кеша.
Пожалуйста, попробуйте вручную указать в html этот тег
<link rel = "icon" type = "image/x-icon" href = "/7f9fa4.ico" />
и напишите результат.