Requests-Cache#

Build Codecov Documentation Code Shelter

PyPI Conda PyPI - Python Versions PyPI - Downloads

Summary#

requests-cache is a transparent, persistent cache that provides an easy way to get better performance with the python requests library.

Features#

  • 🍰 Ease of use: Keep using the requests library you’re already familiar with. Add caching with a drop-in replacement for requests.Session, or install globally to add caching to all requests functions.

  • 🚀 Performance: Get sub-millisecond response times for cached responses. When they expire, you still save time with conditional requests.

  • 💾 Persistence: Works with several storage backends including SQLite, Redis, MongoDB, and DynamoDB; or save responses as plain JSON files, YAML, and more

  • ⚙️ Customization: Works out of the box with zero config, but with a robust set of features for configuring and extending the library to suit your needs

  • 🕗 Expiration: Keep your cache fresh using Cache-Control, eagerly cache everything for long-term storage, use URL patterns for selective caching, or any combination of strategies

  • ✔️ Compatibility: Can be combined with other popular libraries based on requests

Quickstart#

First, install with pip:

pip install requests-cache

Then, use requests_cache.CachedSession to make your requests. It behaves like a normal requests.Session, but with caching behavior.

To illustrate, we’ll call an endpoint that adds a delay of 1 second, simulating a slow or rate-limited website.

This takes 1 minute:

import requests

session = requests.Session()
for i in range(60):
    session.get('http://httpbin.org/delay/1')

This takes 1 second:

import requests_cache

session = requests_cache.CachedSession('demo_cache')
for i in range(60):
    session.get('http://httpbin.org/delay/1')

With caching, the response will be fetched once, saved to demo_cache.sqlite, and subsequent requests will return the cached response near-instantly.

Patching:

If you don’t want to manage a session object, or just want to quickly test it out in your application without modifying any code, requests-cache can also be installed globally, and all requests will be transparently cached:

import requests
import requests_cache

requests_cache.install_cache('demo_cache')
requests.get('http://httpbin.org/delay/1')

Configuration:

A quick example of some of the options available:

# fmt: off
from datetime import timedelta
from requests_cache import CachedSession

session = CachedSession(
    'demo_cache',
    use_cache_dir=True,                # Save files in the default user cache dir
    cache_control=True,                # Use Cache-Control headers for expiration, if available
    expire_after=timedelta(days=1),    # Otherwise expire responses after one day
    allowable_methods=['GET', 'POST'], # Cache POST requests to avoid sending the same data twice
    allowable_codes=[200, 400],        # Cache 400 responses as a solemn reminder of your failures
    ignored_parameters=['api_key'],    # Don't match this param or save it in the cache
    match_headers=True,                # Match all request headers
    stale_if_error=True,               # In case of request errors, use stale cache data if possible
)

Contents#