FastAPI中类似面向切面编程(python)

1:中间件(Middleware)

python 复制代码
# 添加一个中间件来记录所有请求
@app.middleware("http")
async def log_requests(request: Request, call_next):
    logger.info(f"收到请求: {request.method} {request.url}")
    try:
        # 前置处理
        print("Before request")
        response = await call_next(request)
        logger.info(f"响应状态: {response.status_code}")
        # 后置处理
        print("After request")
        return response
    except Exception as e:
        logger.error(f"处理请求时发生错误: {e}")
        raise

2:依赖注入系统(Dependencies),可以创建可重用的依赖来实现横切关注点:

2-1:例子一

python 复制代码
from fastapi import Depends, Request

async def common_dependency(request: Request):
    print("Common logic for all endpoints")
    return {"user_id": 123}

@app.get("/")
async def root(common: dict = Depends(common_dependency)):
    return {"message": "Welcome"}

@app.post("/items")
async def create_item(common: dict = Depends(common_dependency)):
    return {"item_id": 1}

2-2:例子二

python 复制代码
from fastapi import Depends
import asyncio

# 1. 定义「切面逻辑」的依赖函数(可同步/异步)
async def method_common_dependency():
    """方法级通用切面:前置校验、资源初始化等"""
    print("方法执行前的切面逻辑:检查权限/初始化资源")
    # 模拟耗时操作(如查数据库、调用第三方服务)
    await asyncio.sleep(0.1)
    # 返回需要注入到方法的上下文数据
    return {"trace_id": "abc-123", "timestamp": 1735689600}

# 2. 普通方法(非 HTTP 接口)使用 Depends 注入切面逻辑
async def business_method_1(
    param1: str,
    # 注入切面依赖(和路由用法完全一致)
    common_ctx: dict = Depends(method_common_dependency)
):
    print(f" 执行业务方法1,参数:{param1},上下文:{common_ctx}")
    return {"result": f"success_{param1}", "trace_id": common_ctx["trace_id"]}

async def business_method_2(
    param2: int,
    common_ctx: dict = Depends(method_common_dependency)
):
    print(f" 执行业务方法2,参数:{param2},上下文:{common_ctx}")
    return {"result": param2 * 10, "trace_id": common_ctx["trace_id"]}

# 3. 测试调用
async def main():
    res1 = await business_method_1("test")
    res2 = await business_method_2(5)
    print("最终结果:", res1, res2)

asyncio.run(main())

3:路由器级别的中间件,可以为特定的路由器添加中间件:

python 复制代码
# 在 auth/router.py 中
router = APIRouter()

@router.middleware("http")
async def auth_middleware(request: Request, call_next):
    # 只应用于 auth 路由器下的所有端点
    print("Auth specific middleware")
    response = await call_next(request)
    return response

4: 装饰器模式,创建自定义装饰器来包装路由函数:

python 复制代码
from functools import wraps

def log_calls(func):
    @wraps(func)
    async def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        result = await func(*args, **kwargs)
        print(f"Finished {func.__name__}")
        return result
    return wrapper

@app.get("/")
@log_calls
async def root():
    return {"message": "Welcome"}

5:事件处理器,FastAPI 提供了应用级别的事件处理器:

python 复制代码
@app.on_event("startup")
async def startup_event():
    # 应用启动时执行
    pass

@app.on_event("shutdown")
async def shutdown_event():
    # 应用关闭时执行
    pass
相关推荐
玄同7657 小时前
Python 后端三剑客:FastAPI/Flask/Django 对比与 LLM 开发选型指南
人工智能·python·机器学习·自然语言处理·django·flask·fastapi
张3蜂1 天前
Python 四大 Web 框架对比解析:FastAPI、Django、Flask 与 Tornado
前端·python·fastapi
雪碧聊技术1 天前
ORM简介、安装、使用流程
fastapi·orm·基础代码编写
曲幽1 天前
FastAPI实战:用懒加载与Lifespan优雅管理重型依赖
fastapi·async·lifespan·lazy loading·startup event
雪碧聊技术1 天前
ORM-查询
fastapi·orm·查询
Li emily2 天前
解决港股实时行情数据 API 接入难题
人工智能·python·fastapi
yuezhilangniao2 天前
AI智能体全栈开发工程化规范 备忘 ~ fastAPI+Next.js
javascript·人工智能·fastapi
a1117762 天前
图书借阅管理系统(FastAPI + Vue)
前端·vue.js·fastapi
曲幽2 天前
FastAPI生命周期管理实战:从启动到关闭,如何优雅地管好你的“资源家当”
redis·python·fastapi·web·shutdown·startup·lifespan
极客小云2 天前
【基于AI的自动商品试用系统:不仅仅是虚拟试衣!】
javascript·python·django·flask·github·pyqt·fastapi