fastapi-cache is a tool to cache fastapi response and function result, with backends support redis, memcache, and dynamodb.
- Support
redis,memcache,dynamodb, andin-memorybackends. - Easily integration with
fastapi. - Support http cache like
ETagandCache-Control.
asyncioenvironment.redisif useRedisBackend.memcacheif useMemcacheBackend.aiobotocoreif useDynamoBackend.
> pip install fastapi-cache2or
> pip install "fastapi-cache2[redis]"or
> pip install "fastapi-cache2[memcache]"or
> pip install "fastapi-cache2[dynamodb]"importaioredisfromfastapiimportFastAPIfromstarlette.requestsimportRequestfromstarlette.responsesimportResponsefromfastapi_cacheimportFastAPICachefromfastapi_cache.backends.redisimportRedisBackendfromfastapi_cache.decoratorimportcacheapp=FastAPI()
@cache()asyncdefget_cache():
return1@app.get("/")@cache(expire=60)asyncdefindex(request: Request, response: Response):
returndict(hello="world")
@app.on_event("startup")asyncdefstartup():
redis=aioredis.from_url("redis://localhost", encoding="utf8", decode_responses=True)
FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache")Firstly you must call FastAPICache.init on startup event of fastapi, there are some global config you can pass in.
If you want cache fastapi response transparently, you can use cache as decorator between router decorator and view function and must pass request as param of view function.
| Parameter | type, description |
|---|---|
| expire | int, states a caching time in seconds |
| namespace | str, namespace to use to store certain cache items |
| coder | which coder to use, e.g. JsonCoder |
| key_builder | which key builder to use, default to builtin |
And if you want use ETag and Cache-Control features, you must pass response param also.
You can also use cache as decorator like other cache tools to cache common function result.
By default use JsonCoder, you can write custom coder to encode and decode cache result, just need inherit fastapi_cache.coder.Coder.
@app.get("/")@cache(expire=60,coder=JsonCoder)asyncdefindex(request: Request, response: Response):
returndict(hello="world")By default use builtin key builder, if you need, you can override this and pass in cache or FastAPICache.init to take effect globally.
defmy_key_builder(
func,
namespace: Optional[str] ="",
request: Request=None,
response: Response=None,
*args,
**kwargs,
):
prefix=FastAPICache.get_prefix()
cache_key=f"{prefix}:{namespace}:{func.__module__}:{func.__name__}:{args}:{kwargs}"returncache_key@app.get("/")@cache(expire=60,coder=JsonCoder,key_builder=my_key_builder)asyncdefindex(request: Request, response: Response):
returndict(hello="world")InMemoryBackend store cache data in memory and use lazy delete, which mean if you don't access it after cached, it will not delete automatically.
This project is licensed under the Apache-2.0 License.