2017-02-04 17 views
2

Я использую python 3.6 с модулем requests для использования API и CacheControl модуль для кэширования ответа API. Я использую следующий код, но кэш не кажется, работает:Python: HTTP-кеширование с использованием 'CacheControl` не работает

import requests 
from cachecontrol import CacheControl 

sess = requests.session() 
cached_sess = CacheControl(sess) 

response = cached_sess.get('https://jsonplaceholder.typicode.com/users') 

Каждый запрос на этот URL возвращает код статуса 200 (вместо 304 кода состояния) и тот же ресурс запрашивается каждый раз, даже несмотря на то, ETag заголовки такие же, и max-age был по-прежнему действителен. API возвращает следующие заголовки, связанные с кешем:

'Cache-Control': 'public, max-age=14400' 
'Expires': 'Sat, 04 Feb 2017 22:23:28 GMT' (time of original request) 
'Etag': 'W/"160d-MxiAGkI3ZBrjm0xiEDfwqw"' 

В чем проблема?

UPDATE: Я не посылая If-None-Match заголовок с любым API вызова, я вручную должны это сделать или CacheControl модуль должен заботиться о нем автоматически?

ответ

0

Используйте реализацию кэша для сохранения кеша между прогонами программы.

from cachecontrol.caches import FileCache 

sess = requests.session() 
cached_sess = CacheControl(sess, cache = FileCache('.web_cache')) 

Кроме того, убедитесь, что вы используете недавний выпуск CacheControl. CacheControl имеет только cached resources served as Transfer-Encoding: chunked так 0.11.7:

$ curl -si https://jsonplaceholder.typicode.com/users | fgrep -i transfer-encoding 
Transfer-Encoding: chunked 

Каждый запрос на этот URL возвращает код 200 статус

Это то, что вы будете видеть, когда CacheControl работает правильно. Возврат кэшированного ответа или использование 304 скрыт от вас как клиент кода. Если вы считаете, что свежий запрос делается на вышестоящий сервер, рассмотреть что-то вроде:

import logging 

logging.basicConfig() 
logging.getLogger().setLevel(logging.DEBUG) 

, чтобы увидеть, что cachecontrol.controller и requests.packages.urllib3.connectionpool делают.

+0

Спасибо за ваш ответ. Я использую последнюю версию CacheControl 0.12.0. Вместо метода 'DictCache' по умолчанию я также попробовал метод FileCache, но это тоже не работает. Однако метод 'DictCache' работает, только если я отправляю' If-None-Match' вручную с запросом. Кроме того, ответ не имеет заголовка «Transfer-Encoding», но имеет «Content-Encoding: gzip», может это проблема? –