Starlette 第三方生态全景指南插件、框架与集成方案【免费下载链接】starletteThe little ASGI framework that shines. 项目地址: https://gitcode.com/gh_mirrors/st/starletteStarlette 作为一款轻量级 ASGI 框架其价值不仅在于自身提供的高性能路由、中间件、WebSocket 与后台任务能力更在于围绕它生长出的庞大第三方生态从认证授权、监控告警、Serverless 部署到表单校验、OpenAPI 文档生成乃至基于它二次封装的完整 Web 框架不一而足。本指南以 docs/third-party-packages.md 为主线逐一梳理当前仓库收录的第三方包并对照 Starlette 应用实现 与核心文档讲清每个扩展点如何与 Starlette 融合、适合解决什么问题。读完本文你将掌握 Starlette 生态的全局地图并能在自己的项目中快速定位最合适的集成方案。一、先理解 Starlette 的扩展点第三方包如何接入在逐一介绍第三方包之前有必要先弄清 Starlette 为生态提供的几个核心扩展点。第三方包正是通过以下机制与 Starlette 无缝协作的1. ASGI 中间件栈Starlette 的Starlette应用类在构建时会把用户声明的中间件与内置中间件组装成一条 ASGI 链。从 applications.py 的build_middleware_stack实现可以看到最外层永远是ServerErrorMiddleware兜底 500 错误、DEBUG 模式显示 traceback最内层永远是ExceptionMiddleware处理HTTPException等预期异常用户通过Starlette(middleware[...])声明的中间件按声明顺序夹在两者之间若设置了max_body_size还会自动插入RequestBodyLimitMiddleware。from starlette.applications import Starlette from starlette.middleware import Middleware from starlette.middleware.httpsredirect import HTTPSRedirectMiddleware from starlette.middleware.trustedhost import TrustedHostMiddleware routes [...] middleware [ Middleware( TrustedHostMiddleware, allowed_hosts[example.com, *.example.com], ), Middleware(HTTPSRedirectMiddleware) ] app Starlette(routesroutes, middlewaremiddleware)第三方生态中大量中间件型插件Starlette Compress、Starlette Cramjam、Starlette Context、Starlette OAuth2 API、Starlette Prometheus、Starsessions、Sentry 的 Starlette 集成等都是标准的 ASGI 中间件只需像上面这样用Middleware包裹后传入middleware列表即可生效。中间件自顶向下执行请求先穿过外层再到达路由与端点响应则反向返回。2. 路由与 Mount 挂载Starlette 的路由系统支持RouteHTTP 路由、WebSocketRoute和Mount挂载子应用。很多第三方包本身就是一个完整 ASGI 应用如静态资源服务、Prometheus 指标端点可以直接通过Mount挂到指定路径下。相关用法见 docs/routing.md 与 docs/staticfiles.mdfrom starlette.applications import Starlette from starlette.routing import Mount from starlette.staticfiles import StaticFiles routes [ Mount(/static, appStaticFiles(directorystatic), namestatic), ] app Starlette(routesroutes)3. Lifespan 生命周期钩子Starlette 以lifespan上下文管理器取代了旧的on_startup/on_shutdown声明式事件用于在应用启动前初始化资源、在关闭后清理资源详见 docs/lifespan.mdimport contextlib from starlette.applications import Starlette contextlib.asynccontextmanager async def lifespan(app): async with some_async_resource(): print(Run at startup!) yield print(Run on shutdown!) app Starlette(routes[...], lifespanlifespan)从 routing.py 的Router.__init__可以看出lifespan参数会转化为内部的生命周期上下文并在 Router.lifespan 方法 中处理 ASGI 的lifespan.startup/lifespan.shutdown协议消息。这也是下文Starlette Bridge这一兼容层存在的背景。4. 后台任务与静态资源响应可通过background参数挂载进程内后台任务见 docs/background.md用于发送邮件、写日志等收尾工作StaticFiles支持目录与 Python 包内静态资源两种来源见 docs/staticfiles.md。理解以上扩展点后再来看生态中的第三方包就会一目了然它们要么以中间件形式插入请求链路要么以路由/子应用形式挂载要么以框架层封装替换开发体验。二、插件Plugins按能力域分类的生态地图原文档的 Plugins 部分收录了 22 个项目按功能域可归纳为以下几类便于按需取用。2.1 可观测性与监控APM / Metrics / LoggingApitally面向 Starlette及其他框架构建的 REST API 提供分析、请求日志与监控能力。适合上线后快速掌握接口的调用量、耗时与错误分布。Scout APMAPM应用性能监控方案可对应用进行埋点插桩帮助定位性能瓶颈。接入方式通常是把其提供的中间件放入middleware列表与上文TrustedHostMiddleware的用法一致。Starlette Prometheus基于 Prometheus 官方 Python clientclient_python提供一个暴露 Prometheus 指标的端点插件。典型用法是在路由中挂载其指标视图from starlette.applications import Starlette from starlette.routing import Route from starlette_prometheus import metrics, PrometheusMiddleware middleware [Middleware(PrometheusMiddleware)] routes [Route(/metrics, metrics)] app Starlette(routesroutes, middlewaremiddleware)Sentry见原文档 Frameworks 部分但实质是监控集成软件错误检测工具支持错误追踪、性能洞察、上下文信息与告警通知并与 Starlette 无缝集成。通常通过其sentry_sdk初始化并在 Starlette 应用创建时挂载SentryAsgiMiddleware或在初始化时配置integrations[StarletteIntegration()]。Starlette Context一个中间件允许存取请求级上下文数据可与日志系统配合让日志自动携带x-request-id、x-correlation-id等请求头。这在分布式链路排查中非常实用——先解析请求头写入 context再在日志格式中引用。2.2 认证与授权OAuth2 / OpenID Connect / 会话Authlib构建 OAuth 与 OpenID Connect 客户端和服务端的 Python 库文档提供了与 Starlette 集成的专门章节。适合做第三方登录GitHub、Google 等、单点登录或自建授权服务器。Starlette OAuth2 API一个 Starlette 中间件通过 JWT 增加认证与授权能力完全依赖授权提供方auth provider为客户端签发访问令牌access token和/或 ID 令牌id token。典型场景是把其中间件配置好密钥与校验规则后套在受保护路由上。Imia面向 Starlette 的认证框架提供可插拔的认证器authenticators以及完整的登录/登出流程。相比轻量 JWT 方案它更适合需要多策略认证如用户名密码、OAuth、API Key 并存的应用。Starlette-Login用户会话管理库处理登录、登出以及长时间记住用户会话的常见任务。它提供login_user、logout_user与login_required等辅助模式上对标经典 Web 框架的登录态管理适合服务端渲染页面应用。Starsessions替代性的会话实现支持可定制的存储后端storage backends比如把会话数据落到 Redis、数据库而非默认 Cookie 中。这比 Starlette 内置的 SessionMiddleware基于 itsdangerous 签名 Cookiesession_cookiesession、max_age默认 14 天、same_sitelax详见源码 sessions.py更灵活适合需要服务端会话存储的场景。webargs-starlette基于 webargs 构建的声明式请求解析与校验库可用类型注解解析 querystring、JSON、表单、headers 与 cookies。与 Starlette 自身的request.query_params、request.json()相比它把解析 校验合二为一配合 marshmallow schema 使用from webargs import fields from webargs_starlette import use_args args {name: fields.Str(requiredTrue), count: fields.Int(missing0)} use_args(args) async def index(request, args): return JSONResponse(args)2.3 WebSocket 广播与实时通信ChannelBox面向 ASGI 应用的轻量级 WebSocket 广播方案可以向命名的 WebSocket 频道组发送消息并与 Starlette 和 FastAPI 集成。适合实现聊天室通知推送等一对多实时场景无需引入完整的消息队列。Nejma同样面向 WebSocket 的频道组消息管理与发送库官方示例中还配套了基于nejma与 Starlette 构建的简单聊天应用nejma-chat。如果你需要一个上手极快的频道广播方案它是 ChannelBox 之外的另一选择。这类包通常与 Starlette 的WebSocketRoute协同工作连接建立时加入频道组断开时离开频道组业务逻辑通过频道名向组内所有连接广播消息。2.4 Serverless 部署适配MangumAWS Lambda 与 API Gateway 的 Serverless ASGI 适配器。其核心价值在于把 ASGI 应用包装为 Lambda handler让 Starlette 应用无需改动即可跑在无服务器环境from mangum import Mangum from starlette.applications import Starlette app Starlette(routes[...]) handler Mangum(app)VelloxGCP Cloud Functions 的 Serverless ASGI 适配器与 Mangum 对 AWS 的定位类似。如果你的基础设施在 Google Cloud可直接用它将 Starlette 应用部署为云函数。2.5 API 文档与 SchemaOpenAPI / SwaggerSpecTree用 Python 注解生成 OpenAPI 规范文档并校验请求与响应无需编写 YAML 样板。适合希望零配置出文档的团队。Starlette APISpec简单的 APISpec 集成允许在端点 docstring 中以 YAML 声明 OpenAPISwaggerschema从而为 Starlette REST API 生成文档。Apiman见原文档 Frameworks 部分为 Starlette 项目集成 Swagger/OpenAPI 文档的扩展并提供 SwaggerUI 与 RedocUI 两种文档界面。适合在已有路由上快速补齐交互式 API 文档。2.6 压缩中间件Starlette Compress快速、简单的响应压缩中间件开箱支持 ZStd、Brotli 与 GZip 压缩并提供合理的默认配置。对比来看Starlette 内置的GZipMiddleware只支持 gzip源码见 gzip.py默认minimum_size500、compresslevel9、超过 128 KiB 的响应转工作线程压缩并默认排除图片、视频、woff 字体、text/event-stream等本已压缩或流式的内容类型。如果你的客户端支持 Brotli/ZStd用 Starlette Compress 可获得更优压缩率。Starlette Cramjam基于 cramjam 实现的压缩中间件以极少的依赖支持brotli、gzip和deflate三种算法。与 Starlette Compress 定位相近可根据依赖偏好选择。2.7 表单处理与 HTML 辅助Starlette WTF整合 Starlette 与 WTForms 的工具建模自著名的 Flask-WTF。适合服务端渲染表单场景表单类定义、CSRF 保护、渲染与校验一站式解决。Starlette 本身已提供 FormParser 支持multipart/form-data与application/x-www-form-urlencoded见 docs/requests.md而 Starlette WTF 在解析之上补充了 WTForms 的声明式表单模型与校验能力。2.8 路由增强与开发体验DecoRouter为 Starlette 提供 FastAPI 风格的路由装饰器通过装饰器生成路由表。适合喜欢装饰器声明路由、又不希望引入完整 FastAPI 的场景from decoRouter import Router router Router() router.get(/items/{item_id}) async def get_item(item_id: int): return {item_id: item_id}2.9 错误展示Starception为 Starlette 应用提供漂亮的异常页面。开发调试时配合Starlette(debugTrue)可让错误页更直观、更易读。2.10 管理后台Starlette-Admin简单且可扩展的管理后台框架基于 Tabler 与 Datatables 构建可快速为模型生成高度可定制的管理界面支持导出多种格式数据CSV、PDF、Excel 等、支持包含 AND/OR 条件的复杂过滤查询、文件上传等功能。适合需要快速交付内部管理系统的项目。三、Starlette Bridge旧事件声明方式的兼容层原文档用独立小节介绍Starlette Bridge随着on_startup与on_shutdown被弃用Starlette Bridge 保证你仍能使用旧的事件声明方式其内部会自动为你创建lifespan。这样既维持了存量包/存量代码的向后兼容又不破坏 Starlette 新lifespan事件的完整性。为什么需要它正如上文分析 routing.py 所示新版 Starlette 的Router只接受lifespan上下文管理器且Lifespan类型已迁移到 types.py同时在 applications.py 的文档字符串中明确写着This is a newer style that replaces theon_startupandon_shutdownhandlers. Use one or the other, not both.这是替代on_startup/on_shutdown的新风格二者选其一不可混用。因此存量应用或中间件若仍以旧方式声明事件就需要 Bridge 这类适配层from starlette_bridge import Bridge # 旧写法 # app Starlette( # routesroutes, # on_startup[startup_task], # on_shutdown[shutdown_task], # ) # Bridge 写法 app Bridge(routesroutes, on_startup[startup_task], on_shutdown[shutdown_task])Bridge 内部把on_startup/on_shutdown列表转换为一个完整的lifespan上下文使旧代码在新版本上无缝运行。四、框架Frameworks基于 Starlette 的完整解决方案原文档 Frameworks 部分收录了在 Starlette 之上构建的完整框架与集成它们并非插件而是把 Starlette 作为底层引擎重新封装出一套开发范式。FastAPI高性能、易上手、开发快、可直接上生产的 Web API 框架。受 APIStar 的路线参数类型声明启发基于 OpenAPI 3.0.0 规范含 JSON Schema并由 Pydantic 负责数据处理。可以说它是 Starlette 生态中传播最广的上层框架Starlette 提供 ASGI 运行时与路由FastAPI 在其上增加类型驱动校验、依赖注入与自动文档。Flama面向数据科学的框架目标是让机器学习MLAPI 的部署变得可笑地简单。数据科学家可以用一行代码把 ML 模型变成异步、自动生成文档的 API它自带直观的 CLI支持快速构建高性能的 GraphQL、REST 与 ML API并提供 ML 模型的自动部署能力适合快速搭建异步、可上生产的推理服务。Greppo构建地理空间geospatial仪表盘与 Web 应用的 Python 框架提供快速集成数据、算法、可视化与 UI 交互的工具包支持后端变量更新、逻辑重算并在前端反映变更数据变更钩子。底层依赖 Starlette 与 asyncio 提供 Web 服务能力。Responder异步 Web 服务框架特性包括 Flask 风格路由表达式、YAML 支持、OpenAPI schema 生成、后台任务与 GraphQL。Starlette-apps借鉴 Django-GDAPS 或 CakePHP 的应用app系统思想让你用简单的 app 体系自组装自己的框架——把项目拆分为多个可复用 app再统一挂载到 Starlette 应用上。Dark Star一个旨在最小化把 HTML 送到浏览器所需代码量的简单框架把文件路径变成 Starlette 路由把视图代码放在模板旁边并内置对 htmx 的支持以增强前端交互。适合服务端渲染 渐进增强的轻量 Web 应用。Xpresso构建在 Starlette、Pydantic 与di之上的灵活、可扩展 Web 框架。di负责依赖注入适合偏好函数式依赖注入风格、同时想要类型安全与可扩展性的团队。EllarASGI Web 框架用于构建快速、高效、可扩展的 REST API 与服务端应用。它提供高层抽象融合面向对象OOP与函数式FP编程元素灵感来自 NestJS核心依赖为 Starlette、Pydantic 与 injector。适合从 Node/NestJS 背景迁移、习惯模块化 DI 架构的团队。Starlette-Babel通过 Babel 集成提供翻译i18n、本地化与时区支持适合需要多语言界面的应用。Starlette-StaticResources允许挂载 Python 包资源package resources见 Pythonimportlib.resources文档作为静态数据用法类似 StaticFiles但数据来源是已安装的 Python 包而非文件系统目录。这对把静态资源打进包内分发的库型项目特别有用from starlette.applications import Starlette from starlette.routing import Mount from starlette_static_resources import StaticResources routes [ Mount(/static, appStaticResources(packagemypackage)), ] app Starlette(routesroutes)Shiny基于 Starlette 与 asyncio利用响应式编程reactive programming让开发者轻松构建 Python Web 应用。它免去手动状态管理在运行时自动确定应用的最佳执行路径并最小化重渲染支持从最简单的仪表盘到功能完整的 Web 应用。适合数据科学家与分析场景下的交互式应用开发。五、选型建议如何为自己的项目挑选集成方案结合上文分类给出快速选型路径需求场景优先考虑补充说明REST API 文档 校验SpecTree / Starlette APISpec / Apiman想零 YAML 用 SpecTree想沿用 docstring YAML 用 APISpec第三方登录 / OAuth2Authlib / Starlette OAuth2 API做完整 OAuth/OpenID 服务端用 Authlib只想加 JWT 校验中间件用后者登录态与会话Starlette-Login / Starsessions / 内置 SessionMiddleware简单 Cookie 会话用内置需要存储后端用 StarsessionsWebSocket 广播ChannelBox / Nejma两者都轻量按 API 风格偏好选择ServerlessMangumAWS/ VelloxGCP按云厂商选择响应压缩Starlette Compress / Starlette Cramjam需要 Brotli/ZStd 选 Compress追求依赖极简选 Cramjam性能监控Scout APM / Starlette Prometheus / Apitally / Sentry全链路 APM 用 Scout APM指标暴露用 Prometheus错误追踪用 Sentry表单处理Starlette WTF webargs-starlette服务端渲染表单用 WTFAPI 参数解析校验用 webargs-starlette管理后台Starlette-Admin需要快速生成模型 CRUD 界面时完整框架替代FastAPI / Ellar / Xpresso / Flama 等需要 DI、模块化等更高层抽象时旧事件代码迁移Starlette Bridge存量on_startup/on_shutdown代码升级到新版 lifespan六、结语Starlette 的小而美哲学使其成为绝佳的中立基座它自身只提供路由、中间件、WebSocket、后台任务等最小必要能力其余需求全部交由社区以标准 ASGI 方式补齐。从本仓库 docs/third-party-packages.md 收录的清单可以看出生态已覆盖可观测性、认证授权、实时通信、Serverless、API 文档、压缩、表单、管理后台乃至完整框架等各个层面。接入它们的方式高度统一——要么作为Middleware加入请求链要么作为子应用Mount到路径要么在lifespan中初始化资源——这正是 ASGI 标准带来的生态红利。若需深入了解 Starlette 自身的扩展能力可继续阅读 docs/middleware.md、docs/routing.md、docs/lifespan.md 与 docs/staticfiles.md并结合 applications.py 源码理解中间件栈的组装细节。【免费下载链接】starletteThe little ASGI framework that shines. 项目地址: https://gitcode.com/gh_mirrors/st/starlette创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考