/hishel

An elegant HTTP Cache implementation for HTTPX and HTTP Core.

Primary LanguagePythonBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

HTTPX

Hishel - An elegant HTTP Cache implementation for httpx and httpcore.

pypi license license Downloads


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 httpx while also enabling web cache.
  • 🧠 Smart: Attempts to clearly implement RFC 9111, understands Vary, Etag, Last-Modified, Cache-Control, and Expires headers, and handles response re-validation automatically.
  • ⚙️ Configurable: You have complete control over how the responses are stored and serialized.
  • 📦 From the package:
  • 🚀 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://hishel.com")  # 0.4749558370003797s
    client.get("https://hishel.com")  # 0.002873589000046195s (~250x faster!)

or in asynchronous context

import hishel

async with hishel.AsyncCacheClient() as client:
    await client.get("https://hishel.com")
    await client.get("https://hishel.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://hishel.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://hishel.com")
pool.request("GET", "https://hishel.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

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.