diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a15f9d..dd42c45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 0.2 +### 0.2.1 + +- Support cache jinja2 template response. + ### 0.2.0 - Make `request` and `response` optional. diff --git a/examples/redis/index.html b/examples/redis/index.html new file mode 100644 index 0000000..eee639c --- /dev/null +++ b/examples/redis/index.html @@ -0,0 +1,10 @@ + + + + + Title + + +

Cache HTML! {{ ret }}

+ + \ No newline at end of file diff --git a/examples/redis/main.py b/examples/redis/main.py index 9c51d15..6d88a71 100644 --- a/examples/redis/main.py +++ b/examples/redis/main.py @@ -7,13 +7,21 @@ from fastapi import FastAPI from redis.asyncio.connection import ConnectionPool from starlette.requests import Request from starlette.responses import Response - +from fastapi.responses import HTMLResponse +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates from fastapi_cache import FastAPICache from fastapi_cache.backends.redis import RedisBackend +from fastapi_cache.coder import PickleCoder from fastapi_cache.decorator import cache app = FastAPI() +app.mount( + path='/static', + app=StaticFiles(directory='./'), name='static', +) +templates = Jinja2Templates(directory='./') ret = 0 @@ -55,6 +63,14 @@ async def get_datetime(request: Request, response: Response): return pendulum.now() +@app.get('/html', response_class=HTMLResponse) +@cache(expire=60, namespace="html", coder=PickleCoder) +async def cache_html(request: Request): + return templates.TemplateResponse('index.html', { + 'request': request, "ret": await get_ret() + }) + + @app.on_event("startup") async def startup(): pool = ConnectionPool.from_url(url="redis://redis") diff --git a/fastapi_cache/coder.py b/fastapi_cache/coder.py index 0d45079..daeac83 100644 --- a/fastapi_cache/coder.py +++ b/fastapi_cache/coder.py @@ -6,6 +6,7 @@ from typing import Any import pendulum from fastapi.encoders import jsonable_encoder +from starlette.templating import _TemplateResponse as TemplateResponse CONVERTERS = { "date": lambda x: pendulum.parse(x, exact=True), @@ -60,6 +61,8 @@ class JsonCoder(Coder): class PickleCoder(Coder): @classmethod def encode(cls, value: Any): + if isinstance(value, TemplateResponse): + value = value.body return pickle.dumps(value) @classmethod diff --git a/pyproject.toml b/pyproject.toml index d345c73..dfe8dd2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "fastapi-cache2" -version = "0.2.0" +version = "0.2.1" description = "Cache for FastAPI" authors = ["long2ice "] license = "Apache-2.0"