Отправка заголовка If-None-Match при использовании ETag - Python

Узнай цену своей работы

Формулировка задачи:

Изучаю браузерное кеширование, и кувыркаюсь неимоверно. Из учебника код на PHP:
Листинг программы
  1. <?php
  2. $etag = md5(__FILE__.filemtime(__FILE__));
  3. header('Etag: ' . $etag);
  4. if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
  5. && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
  6. header('HTTP/1.0 304 Not Modified');
  7. exit;
  8. }
  9. sleep(5);
  10. ?>
  11. <h1>Etag example</h1>
  12. <?php
  13. echo date("Y-m-d H:i:s").'<br />';
Пытаюсь повторить его на Python. Для начала упростим его. Наша задача просто насадить ETag, и чтобы при повторном обращении к этой странице, на сервер летел заголовок If-None-Match. Ниже вьюха на Django. В комментарии у нас - точка останова обозначена.
Листинг программы
  1. etag ="some_etag"
  2. def home(request):
  3. response = HttpResponse("Hello");
  4. response['ETag'] = etag # Breakpoint
  5. return response
Урлы сделал вот такие: urlpatterns = [ url(r'^home', home), url(r'^home/', home) ] На всякий случай - чтобы переадресации какой не было со слешами. Откроем Chrome и очистим кеш полностью (с самого начала). chrome://cache/ Все чисто - ни одной записи. Откроем инструменты разработчика. Запустим отладочный сервер Django. Идем на localhost:8000/home Задушились на точке останова. И поехали дальше. В кеше появилось http://localhost:8000/home Request:
Листинг программы
  1. GET /home HTTP/1.1
  2. Host: localhost:8000
  3. Connection: keep-alive
  4. User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
  5. Upgrade-Insecure-Requests: 1
  6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  7. Accept-Encoding: gzip, deflate, br
  8. Accept-Language: en-US,en;q=0.9
Response:
Листинг программы
  1. HTTP/1.0 200 OK
  2. Date: Tue, 21 Nov 2017 14:46:48 GMT
  3. Server: WSGIServer/0.2 CPython/3.5.2
  4. X-Frame-Options: SAMEORIGIN
  5. Vary: Cookie
  6. Content-Length: 5
  7. Content-Type: text/html; charset=utf-8
  8. ETag: some_etag
Снова в Chrome ставим курсор на адресную строку браузера, нажимаем Enter. Задушились на точке останова. Идем дальше. Request:
Листинг программы
  1. GET /home HTTP/1.1
  2. Host: localhost:8000
  3. Connection: keep-alive
  4. Cache-Control: max-age=0
  5. User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
  6. Upgrade-Insecure-Requests: 1
  7. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  8. Accept-Encoding: gzip, deflate, br
  9. Accept-Language: en-US,en;q=0.9
Response:
Листинг программы
  1. HTTP/1.0 200 OK
  2. Date: Tue, 21 Nov 2017 14:50:35 GMT
  3. Server: WSGIServer/0.2 CPython/3.5.2
  4. X-Frame-Options: SAMEORIGIN
  5. Vary: Cookie
  6. Content-Length: 5
  7. Content-Type: text/html; charset=utf-8
  8. ETag: some_etag
Теперь попробуем перейти на сторонний сайт. Скажем, lenta.ru. И вернемся кнопкой на наш сайт. Request:
Листинг программы
  1. Request Headers
  2. Provisional headers are shown
  3. Upgrade-Insecure-Requests:1
  4. User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
Response:
Листинг программы
  1. HTTP/1.0 200 OK
  2. Date: Tue, 21 Nov 2017 14:50:35 GMT
  3. Server: WSGIServer/0.2 CPython/3.5.2
  4. X-Frame-Options: SAMEORIGIN
  5. Vary: Cookie
  6. Content-Length: 5
  7. Content-Type: text/html; charset=utf-8
  8. ETag: some_etag
На точке останова не было остановки. Т.е. Chrome не отправлял запрос на сервер - взял из кеша. И показывает мне provisional. Теперь проделаем то же самое в Firefox. Чистка кеша. Request:
Листинг программы
  1. Host: localhost:8000
  2. User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0
  3. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  4. Accept-Language: en-US,en;q=0.5
  5. Accept-Encoding: gzip, deflate
  6. Connection: keep-alive
  7. Upgrade-Insecure-Requests: 1
Response:
Листинг программы
  1. Date: Tue, 21 Nov 2017 14:59:01 GMT
  2. Server: WSGIServer/0.2 CPython/3.5.2
  3. X-Frame-Options: SAMEORIGIN
  4. Vary: Cookie
  5. Content-Length: 5
  6. Content-Type: text/html; charset=utf-8
  7. Etag: some_etag
Опять ставим курсор в адресную строку, Enter. Задушились на точке останова. Резьюм. Request:
Листинг программы
  1. Host: localhost:8000
  2. User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0
  3. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  4. Accept-Language: en-US,en;q=0.5
  5. Accept-Encoding: gzip, deflate
  6. Connection: keep-alive
  7. Upgrade-Insecure-Requests: 1
  8. If-None-Match: some_etag
Response:
Листинг программы
  1. Date: Tue, 21 Nov 2017 15:03:00 GMT
  2. Server: WSGIServer/0.2 CPython/3.5.2
  3. X-Frame-Options: SAMEORIGIN
  4. Vary: Cookie
  5. Content-Length: 5
  6. Content-Type: text/html; charset=utf-8
  7. Etag: some_etag
Ага - появился If-None-Match. Перейдем на lenta.ru. Кнопкой обратно. На точке останова не остановался, т.е. на сервер не стучался. С запросом и ответом вообще какой-то ужас - до сих пор к lenta.ru как бы адресуется. Request:
Листинг программы
  1. Host: icdn.lenta.ru
  2. User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0
  3. Accept: */*
  4. Accept-Language: en-US,en;q=0.5
  5. Accept-Encoding: gzip, deflate, br
  6. Referer: https://icdn.lenta.ru/assets/webpack/631d3915e50011177d6e.desktop.css
  7. Cookie: lid=vAsAAKzrElrbK5o5AYxZAwB=; ruid=pA8AAK3rElqghZkAAXBMNgA=; _ga=GA1.2.113531064.1511189424; _io_un=; _ym_uid=15111894261069667896; last_visit=1511178631673::1511189431673; sspjs_1.0.186_FingerPrint=pA8AAGsis1fM0noHAfRZFgA%3D; sspjs_1.0.186_af_lpdid=%7B%22DATE%22%3A1511189438529%2C%22ID%22%3A%2221%3A494253725%22%7D; lids=48240CB010234C03
  8. Connection: keep-alive
Response:
Листинг программы
  1. Server: nginx/1.13.4
  2. Date: Tue, 21 Nov 2017 15:04:49 GMT
  3. Content-Type: image/png
  4. Content-Length: 6556
  5. Last-Modified: Mon, 20 Nov 2017 14:04:39 GMT
  6. Etag: "5a12e0f7-199c"
  7. Expires: Wed, 21 Nov 2018 15:03:37 GMT
  8. Cache-Control: max-age=31536000
  9. Accept-Ranges: bytes
Ладно, бог с ним, с этим конкретным запросом. А теперь посмотрим, как же у нас работает код на PHP. Для этого я его запустил с помощью веб-сервера Apache. То же самое - чистим кеш хрома. Подчеркиваю, мы в Chrome. Пишем в адресной строке: localhost Закономерно ждем свои секунды, которые занимает sleep. Видим, что в кеше появился http://localhost/ Request:
Листинг программы
  1. GET / HTTP/1.1
  2. Host: localhost
  3. Connection: keep-alive
  4. User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
  5. Upgrade-Insecure-Requests: 1
  6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  7. Accept-Encoding: gzip, deflate, br
  8. Accept-Language: en-US,en;q=0.9
Response:
Листинг программы
  1. HTTP/1.1 200 OK
  2. Date: Tue, 21 Nov 2017 15:10:51 GMT
  3. Server: Apache/2.4.18 (Ubuntu)
  4. Etag: 78489ccce01dd927dcde3f39e94fa47c
  5. Content-Length: 47
  6. Keep-Alive: timeout=5, max=100
  7. Connection: Keep-Alive
  8. Content-Type: text/html; charset=UTF-8
Встаем опять в адресную строку. Нажимаем Enter. Request:
Листинг программы
  1. GET / HTTP/1.1
  2. Host: localhost
  3. Connection: keep-alive
  4. Cache-Control: max-age=0
  5. User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
  6. Upgrade-Insecure-Requests: 1
  7. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  8. Accept-Encoding: gzip, deflate, br
  9. Accept-Language: en-US,en;q=0.9
  10. If-None-Match: 78489ccce01dd927dcde3f39e94fa47c
Response:
Листинг программы
  1. HTTP/1.0 304 Not Modified
  2. Date: Tue, 21 Nov 2017 15:14:30 GMT
  3. Server: Apache/2.4.18 (Ubuntu)
  4. Connection: close
  5. Etag: 78489ccce01dd927dcde3f39e94fa47c
Я вообще ничего не понимаю. Вроде, тот же самый Etag. Был бы признателен за помощь по двум вопросам: 1. Почему Chrome ни разу не послал на сервер If-None-Match в случае с питонячьей реализацией? 2. Почему код на PHP все же при том же самом Etag посылает на сервер If-None-Match?

Решение задачи: «Отправка заголовка If-None-Match при использовании ETag»

textual
Листинг программы
  1. extra_headers.append(("ETag",etag(filepath)))
  2. extra_headers.append(("Last-Modified",last_modified))
  3. extra_headers.append(("Cache-Control", "max-age=%s, must-revalidate" % MAX_AGE)) # MAX_AGE=0

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы