当前位置: 首页 > news >正文

Robyn高性能Web框架系列04:事件、中间件与错误处理

请求-响应过程

    • 应用启动、关闭事件
      • 1、启动事件(Startup Events)
      • 2、关闭事件(Shutdown Events)
    • 中间件
      • 1、前置中间件(BeforeRequest)
      • 2、后置中间件(AfterRequest)
      • 3、示例:性能监控中间件
    • 错误处理


事件(Events)是一种让我们可以在Robyn 应用生命周期中执行特定逻辑的机制,Robyn 为应用程序周期和HTTP请求响应周期定义了四个标准事件,分别是startup事件、shutdown事件、before_request事件、after_request事件。通过这四个事件,我们可以进行应用程序级别或路由级别的程序扩展。在FastAPI中,这些扩展程序也被叫做中间件(middleware)

应用启动、关闭事件

Robyn 中,应用启动、关闭事件常用于全局性的资源初始化、清理任务、集成监控等。

1、启动事件(Startup Events)

在服务器启动完成后执行,常用于初始化数据库连接、加载配置、启动后台任务等。有两种注册方式:
装饰器

@app.startup_handler
async def on_startup():print("应用已启动!准备就绪")

绑定函数

async def on_startup():print("应用已启动!")
app.startup_handler(on_startup)

2、关闭事件(Shutdown Events)

在服务关闭前执行,适合进行资源释放、断开连接、保存状态、清理日志等操作。

@app.shutdown_handler
def on_shutdown():print("服务即将关闭,开始清理")

注意:在事件中同步函数可正常执行,但 async 版本可能有兼容问题,推荐使用同步函数以确保回调正常触发。

中间件

由于Robyn 没有提供与 FastAPI 类似的装饰器 @app.middleware,也没有提供任何的内置中间件。因此,我们只能借助before_request事件、after_request事件来实现中间件的业务逻辑。在Robyn的内部实现中有一个结构叫作 middleware_router,用于管理中间件流程。

1、前置中间件(BeforeRequest)

前置中间件是在每次发起HTTP请求之前所执行的函数。它可以在请求处理之前修改请求对象或执行任何其他操作,可用于统一验证、限流、重写请求等。

@app.before_request("/")
async def hello_before_request(request: Request):request.headers["before"] = "sync_before_request"return request

2、后置中间件(AfterRequest)

后置中间件在路由函数处理完成后执行,用于统一处理响应对象,例如添加全局 Header、日志注入、缓存更新等。

@app.after_request("/*")
def add_header(response):response.headers["X-Powered-By"] = "Robyn"return response

后置中间件接收并返回 Response 对象,可进行链式修改。

3、示例:性能监控中间件

下面我们通过结合使用before_request事件和after_request事件,实现一个简单的性能监控中间件:

import time
from robyn import Robynapp = Robyn(__file__)@app.before_request
def timing_middleware(request):request.start_time = time.time()return request@app.after_request
def timing_after_middleware(request, response):duration = time.time() - request.start_timeprint(f"{request.method} {request.url.path} - {duration:.3f}s")response.headers["X-Response-Time"] = f"{duration:.3f}s"return response@app.get("/slow")
def slow_endpoint():time.sleep(0.1)  # Simulate workreturn {"message": "slow response"}

错误处理

Robyn 提供了 @app.exception装饰器,用于指定系统的异常处理函数,以拦截系统中出现的各种异常,我们可以为所有的异常返回统一格式的响应内容,也可以通过分析拦截到的异常信息返回有针对性的响应内容。

@app.exception  
def handle_exception(error: Exception):  if error is NotFoundError:  return Response(  status_code=404,  description="Not Found",  headers={"Content-Type": "application/json"},  )  else:  return Response(  status_code=500,  description="Internal Server Error",  headers={"Content-Type": "application/json"}  )
http://www.lryc.cn/news/574286.html

相关文章:

  • 前端跨域解决方案(7):Node中间件
  • 2025年CCF先进音频技术竞赛
  • Node鼠标键盘屏幕控制
  • 【LLaMA-Factory 实战系列】二、WebUI 篇 - Qwen2.5-VL 多模态模型 LoRA 微调保姆级教程
  • Perl语言基础
  • Windows环境Browser-Use平台部署与AI自动化远程访问实现过程
  • Java面试题027:一文深入了解数据库Redis(3)
  • Arrays.asList和 List<String> list = new ArrayList<>();有什么区别
  • C++11的内容
  • 智能生成分析报告系统在危化安全生产监测预警评估中的应用
  • NoSQL 之 Redis 配置与优化
  • 【科技公司的管理】
  • 深度解析 Caffeine:高性能 Java 缓存库
  • ​​MQTT​​通讯:​​物联网
  • 爬虫003----requests库
  • UP COIN:从 Meme 共识走向公链与 RWA 的多元生态引擎
  • VLN论文复现——VLFM(ICRA最佳论文)
  • 如何快速判断Excel文档是否被修改过?Excel多版本比对解决方案
  • 睿是信息携手Arctera,深化服务中国市场,共筑数据管理新未来
  • css元素超过两行隐藏并显示省略号全网独一份
  • 2025年CSS最新高频面试题及核心解析
  • ADIOS2 介绍与使用指南
  • 后台发热、掉电严重?iOS 应用性能问题实战分析全过程
  • 【数据结构初阶】--顺序表(一)
  • 【go的测试】单测之gomock包与gomonkey包
  • 板凳-------Mysql cookbook学习 (十--9)
  • K8S: etcdserver: too many requests
  • Halcon ——— OCR字符提取与多类型识别技术详解
  • Java 程序设计试题​
  • 多智能体协同的力量:赋能AI安全报告系统的智能设计之道