2 回答
TA贡献1847条经验 获得超11个赞
错误说明了一切
TypeError: <databases.backends.postgres.Record object at 0x7fb9f01d8a60> is not JSON serializable
错误在于您正在序列化 JSON 中的对象以缓存它,而这在 JSON 中是不可序列化的。
我曾经遇到过类似的问题,但是发现fastAPI的编码器支持该Record
对象,而其他的则不支持。您可以返回通过此类编码器序列化的对象,也可以在 redis 缓存参数中将其设置为编码器。
我没有测试以下代码,但它应该足以说明我的意思。
from fastapi.encoders import jsonable_encoder
@authors.get("/", response_model=List[AuthorOut])
@cached(
ttl=100,
cache=Cache.REDIS,
endpoint="X.X.X.X", #my local ip
serializer=JsonSerializer(),
port=6379,
namespace="main",
#key="key",
)
async def get_authors():
return jsonable_encoder(await db_manager.get_all_authors())
TA贡献1827条经验 获得超8个赞
您可以使用 redis_cache 来访问 RedisDB
connection.py
from typing import Optional
from aioredis import Redis, create_redis_pool
#Create a RedisCache instance
class RedisCache:
def __init__(self):
self.redis_cache: Optional[Redis] = None
async def init_cache(self):
self.redis_cache = await create_redis_pool("redis://localhost:6379/0?encoding=utf-8") #Connecting to database
async def keys(self, pattern):
return await self.redis_cache.keys(pattern)
async def set(self, key, value):
return await self.redis_cache.set(key, value)
async def get(self, key):
return await self.redis_cache.get(key)
async def close(self):
self.redis_cache.close()
await self.redis_cache.wait_closed()
redis_cache = RedisCache()
main.py
from fastapi import FastAPI, applications
from uvicorn import run
from fastapi import FastAPI, Request, Response
from connection import redis_cache
app = FastAPI(title="FastAPI with Redis")
async def get_all():
return await redis_cache.keys('*')
@app.on_event('startup')
async def starup_event():
await redis_cache.init_cache()
@app.on_event('shutdown')
async def shutdown_event():
redis_cache.close()
await redis_cache.wait_closed()
#root
@app.get("/")
def read_root():
return {"Redis": "FastAPI"}
#root > Get all keys from the redis DB
@app.get('/RedisKeys')
async def redis_keys():
return await get_all()
if __name__ == '__main__':
run("main:app", port=3000, reload=True)
我正在使用 uvicorn 访问:
uvicorn main:app --reload
添加回答
举报