diff options
author | Jordan Cook <jordan.cook@pioneer.com> | 2021-09-18 18:03:35 -0500 |
---|---|---|
committer | Jordan Cook <jordan.cook@pioneer.com> | 2021-09-18 18:24:45 -0500 |
commit | 28e99c38090e986cda1145dfbc458e15085450a9 (patch) | |
tree | 28de778a186b82b7fdf19b45c05b24893cfcfc8f | |
parent | 86faa864900445e588b826004d594e8ab40a1c33 (diff) | |
download | requests-cache-28e99c38090e986cda1145dfbc458e15085450a9.tar.gz |
Support expire_after param for CachedSession.send()
-rw-r--r-- | requests_cache/cache_control.py | 2 | ||||
-rw-r--r-- | requests_cache/session.py | 6 | ||||
-rw-r--r-- | tests/unit/test_session.py | 16 |
3 files changed, 22 insertions, 2 deletions
diff --git a/requests_cache/cache_control.py b/requests_cache/cache_control.py index 434c5c2..418ac29 100644 --- a/requests_cache/cache_control.py +++ b/requests_cache/cache_control.py @@ -70,6 +70,7 @@ class CacheActions: cache_control: bool = False, session_expire_after: ExpirationTime = None, urls_expire_after: ExpirationPatterns = None, + request_expire_after: ExpirationTime = None, **kwargs, ): """Initialize from request info and cache settings""" @@ -77,6 +78,7 @@ class CacheActions: directives = get_cache_directives(request.headers) expire_after = coalesce( directives.get('max-age'), + request_expire_after, get_url_expiration(request.url, urls_expire_after), session_expire_after, ) diff --git a/requests_cache/session.py b/requests_cache/session.py index fcf2bb0..a60c93e 100644 --- a/requests_cache/session.py +++ b/requests_cache/session.py @@ -109,7 +109,6 @@ class CacheMixin(MIXIN_BASE): 5. :py:meth:`.BaseCache.get_response` 6. :py:meth:`requests.Session.send` (if not previously cached) 7. :py:meth:`.BaseCache.save_response` (if not previously cached) - """ # If present, set per-request expiration as a request header, to be handled in send() if expire_after is not None: @@ -127,13 +126,16 @@ class CacheMixin(MIXIN_BASE): **kwargs, ) - def send(self, request: PreparedRequest, **kwargs) -> AnyResponse: + def send( + self, request: PreparedRequest, expire_after: ExpirationTime = None, **kwargs + ) -> AnyResponse: """Send a prepared request, with caching. See :py:meth:`.request` for notes on behavior.""" # Determine which actions to take based on request info, headers, and cache settings cache_key = self.cache.create_key(request, **kwargs) actions = CacheActions.from_request( cache_key=cache_key, request=request, + request_expire_after=expire_after, session_expire_after=self.expire_after, urls_expire_after=self.urls_expire_after, cache_control=self.cache_control, diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py index 73f522a..150a650 100644 --- a/tests/unit/test_session.py +++ b/tests/unit/test_session.py @@ -9,6 +9,7 @@ from unittest.mock import patch import pytest import requests +from requests import Request from requests.structures import CaseInsensitiveDict from requests_cache import ALL_METHODS, CachedResponse, CachedSession @@ -659,6 +660,21 @@ def test_per_request__expiration(mock_session): mock_session.expire_after = None response = mock_session.get(MOCKED_URL, expire_after=1) assert response.from_cache is False + assert mock_session.get(MOCKED_URL).from_cache is True + + time.sleep(1) + response = mock_session.get(MOCKED_URL) + assert response.from_cache is False + + +def test_per_request__prepared_request(mock_session): + """The same should work for PreparedRequests with CachedSession.send()""" + mock_session.expire_after = None + request = Request(method='GET', url=MOCKED_URL, headers={}, data=None).prepare() + response = mock_session.send(request, expire_after=1) + assert response.from_cache is False + assert mock_session.send(request).from_cache is True + time.sleep(1) response = mock_session.get(MOCKED_URL) assert response.from_cache is False |