1. 安装依赖
pip install fastapi asynctor uvicorn
2. 主要代码
#!/usr/bin/env python
import os
import sys
from contextlib import AbstractAsyncContextManager, asynccontextmanager
from datetime import timedelta
from pathlib import Path
from asynctor import AsyncRedis
from fastapi import FastAPI, Request
from pydantic import BaseModel
from redis.asyncio import Redis
async def do_sth_with_redis_when_teardown(redis: aioredis.Redis) -> None:
# print(await redis.keys())
pass
@asynccontextmanager
async def lifespan(app: FastAPI):
async with AsyncRedis(app) as redis:
yield
await do_sth_with_redis_when_teardown(redis)
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def get_all_redis_keys(request: Request) -> list[str]:
redis: Redis = AsyncRedis(request)
return await redis.keys()
class Item(BaseModel):
key: str
value: str | int | float | bytes
expire: int | timedelta | None = None
@app.post("/")
async def set_key_value(request: Request, item: Item) -> dict[str, str]:
redis = AsyncRedis(request)
await redis.set(item.key, item.value, item.expire or None)
value = await redis.get(item.key)
return {item.key: value.decode()}
def runserver() -> None:
"""This is for debug mode to start server. For prod, use supervisor+gunicorn instead."""
import uvicorn # type:ignore
root_app = Path(__file__).stem + ":app"
auto_reload = "PYCHARM_HOSTED" not in os.environ
host = "0.0.0.0"
port = 8000
if sys.argv[1:]:
port = int(sys.argv[1])
if sys.platform == "darwin" or sys.platform.lower().startswith("win"):
tool = "open" if Path("/usr/bin/open").exists() else "explorer"
os.system(f"{tool} http://127.0.0.1:{port}") # Auto open browser
uvicorn.run(root_app, host=host, port=port, reload=auto_reload)
if __name__ == "__main__":
runserver()