Merge branch 'master' into documentation

This commit is contained in:
rtruran
2022-08-08 08:16:24 -05:00
9 changed files with 621 additions and 619 deletions

View File

@@ -2,6 +2,10 @@
## 0.1 ## 0.1
### 0.1.9
- Replace `aioredis` with `redis-py`.
### 0.1.8 ### 0.1.8
- Support `dynamodb` backend. - Support `dynamodb` backend.

View File

@@ -14,7 +14,6 @@ style: deps
check: deps check: deps
@poetry run black $(checkfiles) || (echo "Please run 'make style' to auto-fix style issues" && false) @poetry run black $(checkfiles) || (echo "Please run 'make style' to auto-fix style issues" && false)
@poetry run flake8 $(checkfiles) @poetry run flake8 $(checkfiles)
@poetry run bandit -r $(checkfiles)
test: deps test: deps
$(py_warn) poetry run pytest $(py_warn) poetry run pytest

View File

@@ -1,8 +1,10 @@
from datetime import date, datetime from datetime import date, datetime
import time
import aioredis import redis.asyncio as redis
import uvicorn import uvicorn
from fastapi import FastAPI from fastapi import FastAPI
from redis.asyncio.connection import ConnectionPool
from starlette.requests import Request from starlette.requests import Request
from starlette.responses import Response from starlette.responses import Response
@@ -39,6 +41,13 @@ async def get_data(request: Request, response: Response):
return date.today() return date.today()
@app.get("/blocking")
@cache(namespace="test", expire=20)
def blocking(request: Request, response: Response):
time.sleep(5)
return dict(ret=get_ret())
@app.get("/datetime") @app.get("/datetime")
@cache(namespace="test", expire=20) @cache(namespace="test", expire=20)
async def get_datetime(request: Request, response: Response): async def get_datetime(request: Request, response: Response):
@@ -47,8 +56,9 @@ async def get_datetime(request: Request, response: Response):
@app.on_event("startup") @app.on_event("startup")
async def startup(): async def startup():
redis = aioredis.from_url(url="redis://localhost") pool = ConnectionPool.from_url(url="redis://localhost")
FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache") r = redis.Redis(connection_pool=pool)
FastAPICache.init(RedisBackend(r), prefix="fastapi-cache")
if __name__ == "__main__": if __name__ == "__main__":

View File

@@ -43,7 +43,7 @@ class InMemoryBackend(Backend):
async def set(self, key: str, value: str, expire: int = None): async def set(self, key: str, value: str, expire: int = None):
async with self._lock: async with self._lock:
self._store[key] = Value(value, self._now + expire or 0) self._store[key] = Value(value, self._now + (expire or 0))
async def clear(self, namespace: str = None, key: str = None) -> int: async def clear(self, namespace: str = None, key: str = None) -> int:
count = 0 count = 0

View File

@@ -1,6 +1,6 @@
from typing import Tuple from typing import Tuple
from aioredis import Redis from redis.asyncio.client import Redis
from fastapi_cache.backends import Backend from fastapi_cache.backends import Backend

View File

@@ -64,4 +64,4 @@ class PickleCoder(Coder):
@classmethod @classmethod
def decode(cls, value: Any): def decode(cls, value: Any):
return pickle.loads(value) # nosec:B403 return pickle.loads(value) # nosec:B403,B301

View File

@@ -1,15 +1,21 @@
from functools import wraps import asyncio
from typing import Callable, Optional, Type from functools import wraps, partial
import inspect
from typing import TYPE_CHECKING, Callable, Optional, Type
from fastapi_cache import FastAPICache from fastapi_cache import FastAPICache
from fastapi_cache.coder import Coder from fastapi_cache.coder import Coder
if TYPE_CHECKING:
import concurrent.futures
def cache( def cache(
expire: int = None, expire: int = None,
coder: Type[Coder] = None, coder: Type[Coder] = None,
key_builder: Callable = None, key_builder: Callable = None,
namespace: Optional[str] = "", namespace: Optional[str] = "",
executor: Optional["concurrent.futures.Executor"] = None,
): ):
""" """
cache all function cache all function
@@ -17,6 +23,8 @@ def cache(
:param expire: :param expire:
:param coder: :param coder:
:param key_builder: :param key_builder:
:param executor:
:return: :return:
""" """
@@ -63,7 +71,12 @@ def cache(
response.headers["ETag"] = etag response.headers["ETag"] = etag
return coder.decode(ret) return coder.decode(ret)
ret = await func(*args, **kwargs) if inspect.iscoroutinefunction(func):
ret = await func(*args, **kwargs)
else:
loop = asyncio.get_event_loop()
ret = await loop.run_in_executor(executor, partial(func, *args, **kwargs))
await backend.set(cache_key, coder.encode(ret), expire or FastAPICache.get_expire()) await backend.set(cache_key, coder.encode(ret), expire or FastAPICache.get_expire())
return ret return ret

1181
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "fastapi-cache2" name = "fastapi-cache2"
version = "0.1.8" version = "0.1.9"
description = "Cache for FastAPI" description = "Cache for FastAPI"
authors = ["long2ice <long2ice@gmail.com>"] authors = ["long2ice <long2ice@gmail.com>"]
license = "Apache-2.0" license = "Apache-2.0"
@@ -18,27 +18,26 @@ include = ["LICENSE", "README.md"]
python = "^3.7" python = "^3.7"
fastapi = "*" fastapi = "*"
uvicorn = "*" uvicorn = "*"
aioredis = {version = "^2.0", optional = true} redis = { version = "^4.2.0rc1", optional = true }
aiomcache = {version = "*", optional = true} aiomcache = { version = "*", optional = true }
pendulum = "*" pendulum = "*"
aiobotocore = {version = "^1.4.1", optional = true} aiobotocore = { version = "^1.4.1", optional = true }
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
flake8 = "*" flake8 = "*"
isort = "*" isort = "*"
black = "*" black = "*"
pytest = "*" pytest = "*"
bandit = "*"
[build-system] [build-system]
requires = ["poetry>=0.12"] requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api" build-backend = "poetry.masonry.api"
[tool.poetry.extras] [tool.poetry.extras]
redis = ["aioredis"] redis = ["redis"]
memcache = ["aiomcache"] memcache = ["aiomcache"]
dynamodb = ["aiobotocore"] dynamodb = ["aiobotocore"]
all = ["aioredis","aiomcache"] all = ["redis", "aiomcache", "aiobotocore"]
[tool.black] [tool.black]
line-length = 100 line-length = 100