Persistant cache implementation for httpx and httpcore
Project description
Hishel - An elegant HTTP Cache implementation for httpx and httpcore.
Hishel (հիշել, remember) is a library that implements HTTP Caching for HTTPX and HTTP Core libraries in accordance with RFC 9111, the most recent caching specification.
Features
- 💾 Persistence: Responses are cached in the persistent memory for later use.
- 🤲 Compatibility: It is completely compatible with your existing transports or connection pools, whether they are default, custom, or provided by third-party libraries.
- 🤗 Easy to use: You continue to use the httpx and httpcore interfaces. Can be integrated with no changes to the code.
- 🧠 Smart: Attempts to clearly implement RFC 9111, understands
Vary
,Etag
,Last-Modified
,Cache-Control
, andExpires
headers, and handles response re-validation automatically. - ⚙️ Configurable: You have complete control over how the responses are stored and serialized, and there is built-in support for filesystem and redis backends.
- 🚀 Very fast: Your requests will be even faster if there are no IO operations.
Documentation
Go through the Hishel documentation.
QuickStart
Install Hishel
using pip:
$ pip install hishel
Let's begin with an example of a httpx client.
import hishel
with hishel.CacheClient() as client:
client.get("https://www.github.com")
client.get("https://www.github.com") # takes from the cache (very fast!)
or in asynchronous context
import hishel
async with hishel.AsyncCacheClient() as client:
await client.get("https://www.github.com")
await client.get("https://www.github.com") # takes from the cache
HTTPX and HTTP Core
Hishel
also supports the transports of HTTPX
and the connection pools of HTTP Core
.
Hishel
respects existing transports and connection pools and can therefore work on top of them, making hishel a very compatible and flexible library.
Transports example:
import httpx
import hishel
transport = httpx.HTTPTransport()
cache_transport = hishel.CacheTransport(transport=transport)
req = httpx.Request("GET", "https://www.github.com")
cache_transport.handle_request(req)
cache_transport.handle_request(req) # takes from the cache
Connection Pool example:
import httpcore
import hishel
pool = hishel.CacheConnectionPool(pool=httpcore.ConnectionPool())
pool.request("GET", "https://www.github.com")
pool.request("GET", "https://www.github.com") # takes from the cache
How and where are the responses saved?
The responses are stored by Hishel
in storages.
You have complete control over them; you can change storage or even write your own if necessary.
Contributing
Hishel
is a powerful tool, but it is also a new project with potential flaws, so we welcome contributions!
You can open the pull request by following these instructions if you want to improve Hishel
. 💓
- Fork the project.
- Make change.
- Open the pull request.
Changelog
0.0.10 (8/7/2023)
- Add Response metadata. (#33)
- Add API Reference documentation. (#30)
- Use stale responses only if the client is disconnected. (#28)
0.0.9 (8/1/2023)
- Expose Controller API. (#23)
0.0.8 (7/31/2023)
- Skip redis tests if the server was not found. (#16)
- Decrease sleep time for the storage ttl tests. (#18)
- Fail coverage under 100. (#19)
0.0.7 (7/30/2023)
- Add support for
Heuristic Freshness
. (#11) - Change
Controller.cache_heuristically
toController.allow_heuristics
. (#12) - Handle import errors. (#13)
0.0.6 (7/29/2023)
- Fix
Vary
header validation. (#8) - Dump original requests with the responses. (#7)
0.0.5 (7/29/2023)
- Fix httpx response streaming.
0.0.4 (7/29/2023)
- Change
YamlSerializer
name toYAMLSerializer
.
0.0.3 (7/28/2023)
- Add
from_cache
response extension. - Add
typing_extensions
into the requirements.
0.0.2 (7/25/2023)
- Add redis support.
- Make backends thread and task safe.
- Add black as a new linter.
- Add an expire time for cached responses.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.