Requests-cache

Latest version: v1.2.0

Safety actively analyzes 618874 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 1 of 9

1.2.0

⚠️ **Deprecations & removals:**
* Drop support for python 3.7
* Remove methods [deprecated in 1.0](deprecations-1-0) from `CachedSession` and `BaseCache`

🕗 **Expiration & headers:**
* Add support for `X-HTTP-Method-Override` and other headers that can override request method

⚙️ **Session methods:**
* Add `CachedSession.wrap()` classmethod to add caching to an existing `requests.Session` object

💾 **SQLite Backend:**
* Add `vacuum` parameter to `SQLiteCache.delete()` to optionally skip vacuuming after deletion (enabled by default to free up disk space)
* Optimize `SQLiteCache.delete()` when deleting a single key

🧩 **Compatibility:**
* Add support for RFC 7159 JSON body with `decode_content=True` (root element with any type)
* Use timezone-aware UTC datetimes for all internal expiration values
* Add support for python 3.12
* Note: There is a known bug with multiprocess/multithreaded usage of the SQLite backend on python 3.12.
* Add support for cattrs 23.2

🪲 **Bugfixes:**
* Fix `IncompleteRead` error that could sometimes occur with streaming requests due to mismatch with `Content-Length` header
* Handle a corner case with streaming requests, conditional requests, and redirects
* When redacting ignored parameters from a cached response, keep the rest of the original URL and headers without normalizing
* Add `CachedHTTPResponse._request_url` property for compatibility with urllib3
* Fix form boundary used for cached multipart requests to comply with RFC 2046
* If an explicit CA bundle path is passed via `verify` param, cache the response under the same key as `verify=True`
* Handle JSON Content-Type charsets and MIME type variations (such as `application/vnd.api+json`) during request normalization and serialization

1.1.1

* Backport fix from 1.2: Add compatibility with cattrs 23.2

1.1.0

⚙️ **Session settings:**
* Add support for regular expressions with `urls_expire_after`

💾 **SQLite Backend:**
* Add `busy_timeout` argument (see [SQLite docs](https://www.sqlite.org/pragma.html#pragma_busy_timeout) for details)
* In WAL journaling mode (`wal=True`), default to 'normal' synchronous mode instead of 'full'
* Fix potential `OperationalError: database is locked` in multithreaded SQLite usage during bulk delete operations
* Fix deadlock in multithreaded SQLite usage if a thread encounters an error during COMMIT

🪲 **Bugfixes:**
* Fix loading cached JSON content with `decode_content=True` when the root element is a list
* Fix `BaseCache.recreate_keys()` to normalize response bodies with `b'None'`
* Fix `BaseCache.contains()` for multipart POST requests
* Fix `CachedResponse.history` not being fully deserialized on python<=3.8
* Fix request matching with `Vary` and redirects
* Skip normalizing `CachedResponse.url` so it always matches the original request URL
* Avoid unnecessary cache writes for revalidation requests if headers and expiration are unchanged
* Add compatibility with urllib3 2.0

1.0.1

* Ignore `Cache-Control: must-revalidate` and `no-cache` response headers with `cache_control=False`

1.0

* Fix forwarding connection parameters passed to `RedisCache` for redis-py 4.2 and python <=3.8
* Fix forwarding connection parameters passed to `MongoCache` for pymongo 4.1 and python <=3.8

1.0.0

[See all unreleased issues and PRs](https://github.com/requests-cache/requests-cache/milestone/10?closed=1)

🕗 **Expiration & headers:**
* Add support for `Cache-Control: min-fresh`
* Add support for `Cache-Control: max-stale`
* Add support for `Cache-Control: only-if-cached`
* Add support for `Cache-Control: stale-if-error`
* Add support for `Cache-Control: stale-while-error`
* Add support for `Vary`
* Revalidate for `Cache-Control: no-cache` request or response header
* Revalidate for `Cache-Control: max-age=0, must-revalidate` response headers
* Add an attribute `CachedResponse.revalidated` to indicate if a cached response was revalidated for
the current request

⚙️ **Session settings:**
* All settings that affect cache behavior can now be accessed and modified via `CachedSession.settings`
* Add `always_revalidate` session setting to always revalidate before using a cached response (if a validator is available).
* Add `only_if_cached` session setting to return only cached results without sending real requests
* Add `stale_while_revalidate` session setting to return a stale response initially, while a non-blocking request is sent to refresh the response
* Make behavior for `stale_if_error` partially consistent with `Cache-Control: stale-if-error`: Add support for time values (int, timedelta, etc.) in addition to `True/False`

⚙️ **Request settings:**
* Add `only_if_cached` option to `CachedSession.request()` and `send()` to return only cached results without sending real requests
* Add `refresh` option to `CachedSession.request()` and `send()` to revalidate with the server before using a cached response
* Add `force_refresh` option to `CachedSession.request()` and `send()` to awlays make and cache a new request regardless of existing cache contents
* Make behavior for `expire_after=0` consistent with `Cache-Control: max-age=0`: if the response has a validator, save it to the cache but revalidate on use.
* The constant `requests_cache.DO_NOT_CACHE` may be used to completely disable caching for a request

💾 **Backends:**
* **DynamoDB**:
* For better read performance and usage of read throughput:
* The cache key is now used as the partition key
* Redirects are now cached only in-memory and not persisted
* Cache size (`len()`) now uses a fast table estimate instead of a full scan
* Store responses in plain (human-readable) document format instead of fully serialized binary
* Create default table in on-demand mode instead of provisioned
* Add optional integration with DynamoDB TTL to improve performance for removing expired responses
* This is enabled by default, but may be disabled
* Decode JSON and text response bodies so the saved response can be fully human-readable/editable.
May be disabled with `decode_content=False`.
* **Filesystem**:
* The default file format has been changed from pickle to JSON
* Decode JSON and text response bodies so the saved response can be fully human-readable/editable.
May be disabled with `decode_content=False`.
* **MongoDB**:
* Store responses in plain (human-readable) document format instead of fully serialized binary
* Add optional integration with MongoDB TTL to improve performance for removing expired responses
* Disabled by default. See 'Backends: MongoDB' docs for details.
* Decode JSON and text response bodies so the saved response can be fully human-readable/editable.
May be disabled with `decode_content=False`.
* **Redis**:
* Add `ttl_offset` argument to add a delay between cache expiration and deletion
* **SQLite**:
* Improve performance for removing expired responses with `delete()`
* Improve performance (slightly) with a large number of threads and high request rate
* Add `count()` method to count responses, with option to exclude expired responses (performs a fast indexed count instead of slower in-memory filtering)
* Add `size()` method to get estimated size of the database (including in-memory databases)
* Add `sorted()` method with sorting and other query options
* Add `wal` parameter to enable write-ahead logging
* **SQLite, Redis, MongoDB, and GridFS**:
* Close open database connections when `CachedSession` is used as a contextmanager, or if `CachedSession.close()` is called

↔️ **Request matching:**
* Add serializer name to cache keys to avoid errors due to switching serializers
* Always skip both cache read and write for requests excluded by `allowable_methods` (previously only skipped write)
* Ignore and redact common authentication headers and request parameters by default. This provides
some default recommended values for `ignored_parameters`, to avoid accidentally storing common
credentials in the cache. This will have no effect if `ignored_parameters` is already set.
* Support distinct matching for requests that differ only by a parameter in `ignored_parameters`
(e.g., for a request sent both with and without authentication)
* Support distinct matching for requests that differ only by duplicate request params (e.g, `a=1` vs `?a=1&a=2`)

ℹ️ **Convenience methods:**
* Add `expired` and `invalid` arguments to `BaseCache.delete()` (to replace `remove_expired_responses()`)
* Add `urls` and `requests` arguments to `BaseCache.delete()` (to replace `delete_url()`)
* Add `older_than` argument to `BaseCache.delete()` to delete responses older than a given value
* Add `requests` argument to `BaseCache.delete()` to delete responses matching the given requests
* Add `BaseCache.contains()` method to check for cached requests either by key or by `requests.Request` object
* Add `url` argument to `BaseCache.contains()` method (to replace `has_url()`)
* Add `BaseCache.filter()` method to get responses from the cache with various filters
* Add `BaseCache.reset_expiration()` method to reset expiration for existing responses
* Add `BaseCache.recreate_keys()` method to recreate cache keys for all previously cached responses
(e.g., to preserve cache data after an update that changes request matching behavior)
* Update `BaseCache.urls` into a method that takes optional filter params, and returns sorted unique URLs

ℹ️ **Response attributes and type hints:**
* Add `OriginalResponse` type, which adds type hints to `requests.Response` objects for extra attributes added by requests-cache:
* `cache_key`
* `created_at`
* `expires`
* `from_cache`
* `is_expired`
* `revalidated`
* `OriginalResponse.cache_key` and `expires` will be populated for any new response that was written to the cache
* Add request wrapper methods with return type hints for all HTTP methods (`CachedSession.get()`, `head()`, etc.)
* Set `CachedResponse.cache_key` attribute for responses read from lower-level storage methods
(`items()`, `values()`, etc.)

🧩 **Compatibility fixes:**
* **PyInstaller:** Fix potential `AttributeError` due to undetected imports when requests-cache is bundled in a PyInstaller package
* **requests-oauthlib:** Add support for header values as bytes for compatibility with OAuth1 features
* **redis-py:** Fix forwarding connection parameters passed to `RedisCache` for redis-py 4.2 and python <=3.8
* **pymongo:** Fix forwarding connection parameters passed to `MongoCache` for pymongo 4.1 and python <=3.8
* **cattrs:** Add compatibility with cattrs 22.2
* **python:**
* Add tests and support for python 3.11
* Add tests and support for pypy 3.9

🪲 **Bugfixes:**
* Fix usage of memory backend with `install_cache()`
* Fix an uncommon `OperationalError: database is locked` in SQLite backend
* Fix issue on Windows with occasional missing `CachedResponse.created_at` timestamp
* Add `CachedRequest.path_url` property for compatibility with `RequestEncodingMixin`
* Fix potential `AttributeError` due to undetected imports when requests-cache is bundled in a PyInstaller package
* Fix `AttributeError` when attempting to unpickle a `CachedSession` object, and instead disable pickling by raising a `NotImplementedError`
* Raise an error for invalid expiration string values (except for headers containing httpdates)
* Previously, this would be quietly ignored, and the response would be cached indefinitely
* Fix behavior for `stale_if_error` if an error response code is added to `allowable_codes`

📦 **Dependencies:**
* Replace `appdirs` with `platformdirs`

⚠️ <a id="deprecations-1-0">**Deprecations:**</a>

The following methods are deprecated, and will be removed in **1.2**. The recommended
replacements are listed below. If this causes problems for you, please open an issue to discuss.
* `CachedSession.remove_expired_responses()`: `BaseCache.delete(expired=True)`
* `BaseCache.remove_expired_responses()`: `BaseCache.delete(expired=True)`
* `BaseCache.delete_url()`: `BaseCache.delete(urls=[...])`
* `BaseCache.delete_urls()`: `BaseCache.delete(urls=[...])`
* `BaseCache.has_key()`: `BaseCache.contains()`
* `BaseCache.has_url()`: `BaseCache.contains(url=...)`
* `BaseCache.keys()`: `BaseCache.responses.keys()` (for all keys), or `BaseCache.filter()` (for filtering options)
* `BaseCache.values()`: `BaseCache.responses.values()` (for all values), or `BaseCache.filter()` (for filtering options)
* `BaseCache.response_count()`: `len(BaseCache.responses)` (for all responses), or `BaseCache.filter()` (for filtering options)

⚠️ **Breaking changes:**

* After initialization, cache settings can only be accessed and modified via `CachedSession.settings`. Previously, some settings could be modified by setting them on either `CachedSession` or `BaseCache`. In some cases this could silently fail or otherwise have undefined behavior.
* `BaseCache.urls` has been replaced with a method that returns a list of URLs.
* DynamoDB table structure has changed. If you are using the DynamoDB backend, you will need to create a new table when upgrading to 1.0. See [DynamoDB backend docs](https://requests-cache.readthedocs.io/en/stable/user_guide/backends/dynamodb.html#dynamodb) for more details.

**Minor breaking changes:**

The following changes only affect advanced or undocumented usage, and are not expected to impact most users:
* The arguments `match_headers` and `ignored_parameters` must be passed to `CachedSession`. Previously, these could also be passed to a `BaseCache` instance.
* The `CachedSession` `backend` argument must be either an instance or string alias. Previously it would also accept a backend class.
* All serializer-specific `BaseStorage` subclasses have been removed, and merged into their respective parent classes. This includes `SQLitePickleDict`, `MongoPickleDict`, and `GridFSPickleDict`.
* All `BaseStorage` subclasses now have a `serializer` attribute, which will be unused if set to `None`.
* The `cache_control` module (added in `0.7`) has been split up into multiple modules in a new `policy` subpackage

Page 1 of 9

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.