[![](docs/_static/requests-cache-logo-header.png)](https://requests-cache.readthedocs.io)
[![Build](https://github.com/requests-cache/requests-cache/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/requests-cache/requests-cache/actions)
[![Codecov](https://codecov.io/gh/requests-cache/requests-cache/branch/main/graph/badge.svg?token=FnybzVWbt2)](https://codecov.io/gh/requests-cache/requests-cache)
[![Documentation](https://img.shields.io/readthedocs/requests-cache/latest)](https://requests-cache.readthedocs.io/en/stable/)
[![Code Shelter](https://www.codeshelter.co/static/badges/badge-flat.svg)](https://www.codeshelter.co/)
[![PyPI](https://img.shields.io/pypi/v/requests-cache?color=blue)](https://pypi.org/project/requests-cache)
[![Conda](https://img.shields.io/conda/vn/conda-forge/requests-cache?color=blue)](https://anaconda.org/conda-forge/requests-cache)
[![PyPI - Python Versions](https://img.shields.io/pypi/pyversions/requests-cache)](https://pypi.org/project/requests-cache)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/requests-cache?color=blue)](https://pypi.org/project/requests-cache)
## Summary
**requests-cache** is a persistent HTTP cache that provides an easy way to get better
performance with the python [requests](https://requests.readthedocs.io/) library.
<!-- RTD-IGNORE -->
Complete project documentation can be found at [requests-cache.readthedocs.io](https://requests-cache.readthedocs.io).
<!-- END-RTD-IGNORE -->
## Features
* 🍰 **Ease of use:** Keep using the `requests` library you're already familiar with. Add caching
with a [drop-in replacement](https://requests-cache.readthedocs.io/en/stable/user_guide/general.html#sessions)
for `requests.Session`, or
[install globally](https://requests-cache.readthedocs.io/en/stable/user_guide/general.html#patching)
to add transparent caching to all `requests` functions.
* 🚀 **Performance:** Get sub-millisecond response times for cached responses. When they expire, you
still save time with
[conditional requests](https://requests-cache.readthedocs.io/en/stable/user_guide/headers.html#conditional-requests).
* 💾 **Persistence:** Works with several
[storage backends](https://requests-cache.readthedocs.io/en/stable/user_guide/backends.html)
including SQLite, Redis, MongoDB, and DynamoDB; or save responses as plain JSON files, YAML,
and more
* 🕗 **Expiration:** Use
[Cache-Control](https://requests-cache.readthedocs.io/en/stable/user_guide/headers.html#cache-control)
and other standard HTTP headers, define your own expiration schedule, keep your cache clutter-free
with backends that natively support TTL, or any combination of strategies
* ⚙️ **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
* 🧩 **Compatibility:** Can be combined with other
[popular libraries based on requests](https://requests-cache.readthedocs.io/en/stable/user_guide/compatibility.html)
## Quickstart
First, install with pip:
```bash
pip install requests-cache
```
Then, use [requests_cache.CachedSession](https://requests-cache.readthedocs.io/en/stable/modules/requests_cache.session.html)
to make your requests. It behaves like a normal
[requests.Session](https://requests.readthedocs.io/en/latest/user/advanced/#session-objects),
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:**
```python
import requests
session = requests.Session()
for i in range(60):
session.get('https://httpbin.org/delay/1')
```
**This takes 1 second:**
```python
import requests_cache
session = requests_cache.CachedSession('demo_cache')
for i in range(60):
session.get('https://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:
```python
import requests
import requests_cache
requests_cache.install_cache('demo_cache')
requests.get('https://httpbin.org/delay/1')
```
### Headers and Expiration
By default, requests-cache will keep cached responses indefinitely. In most cases, you will want to
use one of the two following strategies to balance cache freshness and performance:
**Define exactly how long to keep responses:**
Use the `expire_after` parameter to set a fixed expiration time for all new responses:
```python
from requests_cache import CachedSession
from datetime import timedelta
# Keep responses for 360 seconds
session = CachedSession('demo_cache', expire_after=360)
# Or use timedelta objects to specify other units of time
session = CachedSession('demo_cache', expire_after=timedelta(hours=1))
```
See [Expiration](https://requests-cache.readthedocs.io/en/stable/user_guide/expiration.html) for
more features and settings.
**Use Cache-Control headers:**
Use the `cache_control` parameter to enable automatic expiration based on `Cache-Control` and other
standard HTTP headers sent by the server:
```python
from requests_cache import CachedSession
session = CachedSession('demo_cache', cache_control=True)
```
See [Cache Headers](https://requests-cache.readthedocs.io/en/stable/user_guide/headers.html)
for more details.
### Settings
The default settings work well for most use cases, but there are plenty of ways to customize
caching behavior when needed. Here is a quick example of some of the options available:
```python
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 response headers for expiration, if available
expire_after=timedelta(days=1), # Otherwise expire responses after one day
allowable_codes=[200, 400], # Cache 400 responses as a solemn reminder of your failures
allowable_methods=['GET', 'POST'], # Cache whatever HTTP methods you want
ignored_parameters=['api_key'], # Don't match this request param, and redact if from the cache
match_headers=['Accept-Language'], # Cache a different response per language
stale_if_error=True, # In case of request errors, use stale cache data if possible
)
```
<!-- RTD-IGNORE -->
## Next Steps
To find out more about what you can do with requests-cache, see:
* [User Guide](https://requests-cache.readthedocs.io/en/stable/user_guide.html)
* [Examples](https://requests-cache.readthedocs.io/en/stable/examples.html)
* [API Reference](https://requests-cache.readthedocs.io/en/stable/reference.html)
* [Project Info](https://requests-cache.readthedocs.io/en/stable/project_info.html)
<!-- END-RTD-IGNORE -->
Raw data
{
"_id": null,
"home_page": "https://github.com/requests-cache/requests-cache",
"name": "requests-cache",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "requests, python-requests, cache, http, http-client, web, webscraping, performance, sqlite, redis, mongodb, gridfs, dynamodb",
"author": "Roman Haritonov",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/1a/be/7b2a95a9e7a7c3e774e43d067c51244e61dea8b120ae2deff7089a93fb2b/requests_cache-1.2.1.tar.gz",
"platform": null,
"description": "[![](docs/_static/requests-cache-logo-header.png)](https://requests-cache.readthedocs.io)\n\n[![Build](https://github.com/requests-cache/requests-cache/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/requests-cache/requests-cache/actions)\n[![Codecov](https://codecov.io/gh/requests-cache/requests-cache/branch/main/graph/badge.svg?token=FnybzVWbt2)](https://codecov.io/gh/requests-cache/requests-cache)\n[![Documentation](https://img.shields.io/readthedocs/requests-cache/latest)](https://requests-cache.readthedocs.io/en/stable/)\n[![Code Shelter](https://www.codeshelter.co/static/badges/badge-flat.svg)](https://www.codeshelter.co/)\n\n[![PyPI](https://img.shields.io/pypi/v/requests-cache?color=blue)](https://pypi.org/project/requests-cache)\n[![Conda](https://img.shields.io/conda/vn/conda-forge/requests-cache?color=blue)](https://anaconda.org/conda-forge/requests-cache)\n[![PyPI - Python Versions](https://img.shields.io/pypi/pyversions/requests-cache)](https://pypi.org/project/requests-cache)\n[![PyPI - Downloads](https://img.shields.io/pypi/dm/requests-cache?color=blue)](https://pypi.org/project/requests-cache)\n\n## Summary\n**requests-cache** is a persistent HTTP cache that provides an easy way to get better\nperformance with the python [requests](https://requests.readthedocs.io/) library.\n\n<!-- RTD-IGNORE -->\nComplete project documentation can be found at [requests-cache.readthedocs.io](https://requests-cache.readthedocs.io).\n<!-- END-RTD-IGNORE -->\n\n## Features\n* \ud83c\udf70 **Ease of use:** Keep using the `requests` library you're already familiar with. Add caching\n with a [drop-in replacement](https://requests-cache.readthedocs.io/en/stable/user_guide/general.html#sessions)\n for `requests.Session`, or\n [install globally](https://requests-cache.readthedocs.io/en/stable/user_guide/general.html#patching)\n to add transparent caching to all `requests` functions.\n* \ud83d\ude80 **Performance:** Get sub-millisecond response times for cached responses. When they expire, you\n still save time with\n [conditional requests](https://requests-cache.readthedocs.io/en/stable/user_guide/headers.html#conditional-requests).\n* \ud83d\udcbe **Persistence:** Works with several\n [storage backends](https://requests-cache.readthedocs.io/en/stable/user_guide/backends.html)\n including SQLite, Redis, MongoDB, and DynamoDB; or save responses as plain JSON files, YAML,\n and more\n* \ud83d\udd57 **Expiration:** Use\n [Cache-Control](https://requests-cache.readthedocs.io/en/stable/user_guide/headers.html#cache-control)\n and other standard HTTP headers, define your own expiration schedule, keep your cache clutter-free\n with backends that natively support TTL, or any combination of strategies\n* \u2699\ufe0f **Customization:** Works out of the box with zero config, but with a robust set of features for\n configuring and extending the library to suit your needs\n* \ud83e\udde9 **Compatibility:** Can be combined with other\n [popular libraries based on requests](https://requests-cache.readthedocs.io/en/stable/user_guide/compatibility.html)\n\n## Quickstart\nFirst, install with pip:\n```bash\npip install requests-cache\n```\n\nThen, use [requests_cache.CachedSession](https://requests-cache.readthedocs.io/en/stable/modules/requests_cache.session.html)\nto make your requests. It behaves like a normal\n[requests.Session](https://requests.readthedocs.io/en/latest/user/advanced/#session-objects),\nbut with caching behavior.\n\nTo illustrate, we'll call an endpoint that adds a delay of 1 second, simulating a slow or\nrate-limited website.\n\n**This takes 1 minute:**\n```python\nimport requests\n\nsession = requests.Session()\nfor i in range(60):\n session.get('https://httpbin.org/delay/1')\n```\n\n**This takes 1 second:**\n```python\nimport requests_cache\n\nsession = requests_cache.CachedSession('demo_cache')\nfor i in range(60):\n session.get('https://httpbin.org/delay/1')\n```\n\nWith caching, the response will be fetched once, saved to `demo_cache.sqlite`, and subsequent\nrequests will return the cached response near-instantly.\n\n### Patching\nIf you don't want to manage a session object, or just want to quickly test it out in your\napplication without modifying any code, requests-cache can also be installed globally, and all\nrequests will be transparently cached:\n```python\nimport requests\nimport requests_cache\n\nrequests_cache.install_cache('demo_cache')\nrequests.get('https://httpbin.org/delay/1')\n```\n\n### Headers and Expiration\nBy default, requests-cache will keep cached responses indefinitely. In most cases, you will want to\nuse one of the two following strategies to balance cache freshness and performance:\n\n**Define exactly how long to keep responses:**\n\nUse the `expire_after` parameter to set a fixed expiration time for all new responses:\n```python\nfrom requests_cache import CachedSession\nfrom datetime import timedelta\n\n# Keep responses for 360 seconds\nsession = CachedSession('demo_cache', expire_after=360)\n\n# Or use timedelta objects to specify other units of time\nsession = CachedSession('demo_cache', expire_after=timedelta(hours=1))\n```\nSee [Expiration](https://requests-cache.readthedocs.io/en/stable/user_guide/expiration.html) for\nmore features and settings.\n\n**Use Cache-Control headers:**\n\nUse the `cache_control` parameter to enable automatic expiration based on `Cache-Control` and other\nstandard HTTP headers sent by the server:\n```python\nfrom requests_cache import CachedSession\n\nsession = CachedSession('demo_cache', cache_control=True)\n```\nSee [Cache Headers](https://requests-cache.readthedocs.io/en/stable/user_guide/headers.html)\nfor more details.\n\n\n### Settings\nThe default settings work well for most use cases, but there are plenty of ways to customize\ncaching behavior when needed. Here is a quick example of some of the options available:\n```python\nfrom datetime import timedelta\nfrom requests_cache import CachedSession\n\nsession = CachedSession(\n 'demo_cache',\n use_cache_dir=True, # Save files in the default user cache dir\n cache_control=True, # Use Cache-Control response headers for expiration, if available\n expire_after=timedelta(days=1), # Otherwise expire responses after one day\n allowable_codes=[200, 400], # Cache 400 responses as a solemn reminder of your failures\n allowable_methods=['GET', 'POST'], # Cache whatever HTTP methods you want\n ignored_parameters=['api_key'], # Don't match this request param, and redact if from the cache\n match_headers=['Accept-Language'], # Cache a different response per language\n stale_if_error=True, # In case of request errors, use stale cache data if possible\n)\n```\n\n<!-- RTD-IGNORE -->\n## Next Steps\nTo find out more about what you can do with requests-cache, see:\n\n* [User Guide](https://requests-cache.readthedocs.io/en/stable/user_guide.html)\n* [Examples](https://requests-cache.readthedocs.io/en/stable/examples.html)\n* [API Reference](https://requests-cache.readthedocs.io/en/stable/reference.html)\n* [Project Info](https://requests-cache.readthedocs.io/en/stable/project_info.html)\n<!-- END-RTD-IGNORE -->\n\n",
"bugtrack_url": null,
"license": "BSD-2-Clause",
"summary": "A persistent cache for python requests",
"version": "1.2.1",
"project_urls": {
"Changelog": "https://requests-cache.readthedocs.io/en/stable/project_info/history.html",
"Documentation": "https://requests-cache.readthedocs.io",
"Homepage": "https://github.com/requests-cache/requests-cache",
"Issues": "https://github.com/requests-cache/requests-cache/issues",
"Repository": "https://github.com/requests-cache/requests-cache"
},
"split_keywords": [
"requests",
" python-requests",
" cache",
" http",
" http-client",
" web",
" webscraping",
" performance",
" sqlite",
" redis",
" mongodb",
" gridfs",
" dynamodb"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "4e2e8f4051119f460cfc786aa91f212165bb6e643283b533db572d7b33952bd2",
"md5": "f5c6d05fa4aaf33120634c2240a4199d",
"sha256": "1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603"
},
"downloads": -1,
"filename": "requests_cache-1.2.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f5c6d05fa4aaf33120634c2240a4199d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 61425,
"upload_time": "2024-06-18T17:17:45",
"upload_time_iso_8601": "2024-06-18T17:17:45.000458Z",
"url": "https://files.pythonhosted.org/packages/4e/2e/8f4051119f460cfc786aa91f212165bb6e643283b533db572d7b33952bd2/requests_cache-1.2.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1abe7b2a95a9e7a7c3e774e43d067c51244e61dea8b120ae2deff7089a93fb2b",
"md5": "27038cb33985f5b144cf32107151921a",
"sha256": "68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1"
},
"downloads": -1,
"filename": "requests_cache-1.2.1.tar.gz",
"has_sig": false,
"md5_digest": "27038cb33985f5b144cf32107151921a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 3018209,
"upload_time": "2024-06-18T17:18:03",
"upload_time_iso_8601": "2024-06-18T17:18:03.774008Z",
"url": "https://files.pythonhosted.org/packages/1a/be/7b2a95a9e7a7c3e774e43d067c51244e61dea8b120ae2deff7089a93fb2b/requests_cache-1.2.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-06-18 17:18:03",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "requests-cache",
"github_project": "requests-cache",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "requests-cache"
}