Sanic框架中间件(Middleware)深度解析

Sanic框架中间件(Middleware)深度解析

sanic Accelerate your web app development | Build fast. Run fast. sanic 项目地址: https://gitcode.com/gh_mirrors/sa/sanic

什么是中间件

在Sanic框架中,中间件是一种强大的机制,允许开发者在HTTP请求/响应生命周期的特定阶段插入自定义逻辑。与监听器(Listener)关注工作进程生命周期不同,中间件专注于HTTP流的处理过程。

中间件分为两种类型:

  1. 请求中间件:在路由处理器执行前运行
  2. 响应中间件:在路由处理器执行后运行

中间件的基本使用

请求中间件示例

@app.on_request
async def extract_user(request):
    # 从请求中提取用户信息并存储在请求上下文中
    request.ctx.user = await get_user_from_token(request)

响应中间件示例

@app.on_response
async def add_security_headers(request, response):
    # 添加安全相关的HTTP头
    response.headers["X-Content-Type-Options"] = "nosniff"
    response.headers["X-Frame-Options"] = "DENY"

中间件执行流程

通过Mermaid图可以清晰理解中间件的执行顺序:

sequenceDiagram
    autonumber
    participant Client
    participant Sanic
    participant Middleware
    participant Handler
    
    Client->>Sanic: HTTP请求
    loop 请求中间件
        Sanic->>Middleware: 执行@app.on_request
        Middleware-->>Sanic: 可选的提前响应
    end
    Sanic->>Handler: 执行路由处理器
    Handler-->>Sanic: 返回响应
    loop 响应中间件
        Sanic->>Middleware: 执行@app.on_response
        Middleware-->>Sanic: 可选的修改响应
    end
    Sanic->>Client: 返回最终响应

中间件注册方式

Sanic提供了多种注册中间件的方式:

装饰器方式(推荐)

@app.on_request
async def before_request(request):
    request.ctx.start_time = time.time()

@app.on_response
async def after_request(request, response):
    duration = time.time() - request.ctx.start_time
    response.headers["X-Response-Time"] = f"{duration:.2f}s"

显式注册方式

async def cors_middleware(request):
    if request.method == "OPTIONS":
        return text("", status=204)

app.register_middleware(cors_middleware, "request")

中间件的核心功能

修改请求和响应

中间件可以修改请求或响应对象:

@app.on_request
async def modify_request(request):
    # 修改请求路径参数
    if "slug" in request.match_info:
        request.match_info["slug"] = request.match_info["slug"].upper()

@app.on_response
async def modify_response(request, response):
    # 统一添加服务器信息
    response.headers["Server"] = "Sanic-Server"

提前响应

中间件可以通过返回响应对象来中断处理流程:

@app.on_request
async def auth_check(request):
    if not request.token or not validate_token(request.token):
        return json({"error": "Unauthorized"}, status=401)

执行顺序控制

请求中间件按照注册顺序执行,响应中间件按照注册的逆序执行。从v22.9版本开始,还可以通过priority参数控制优先级:

@app.on_request(priority=10)  # 高优先级,先执行
async def high_priority_middleware(request):
    print("This runs first")

@app.on_request(priority=-10)  # 低优先级,后执行
async def low_priority_middleware(request):
    print("This runs later")

实际应用场景

  1. 认证与授权:在请求中间件中验证用户权限
  2. 请求日志:记录请求信息和处理时间
  3. 响应处理:统一格式化API响应
  4. CORS处理:添加跨域访问头
  5. 限流:实现API访问频率限制
  6. 数据预处理:对请求参数进行预处理

最佳实践

  1. 保持中间件职责单一,每个中间件只做一件事
  2. 避免在中间件中进行耗时操作,以免影响性能
  3. 合理使用请求上下文(request.ctx)存储中间数据
  4. 对于通用功能,考虑封装为可复用中间件
  5. 注意中间件执行顺序对业务逻辑的影响

通过合理使用中间件,可以极大地提高Sanic应用的开发效率和可维护性,实现横切关注点(Cross-cutting concerns)的集中管理。

sanic Accelerate your web app development | Build fast. Run fast. sanic 项目地址: https://gitcode.com/gh_mirrors/sa/sanic

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温欣晶Eve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值