[Python/WebServer] Starlette:轻量级 ASGI 框架 ≈ Spring Web、支撑 FastAPI 生态的异步 Web 基石

0 序

github repo: encode/starlette(现已迁移至 Kludex/starlette

1 概述

产品介绍

Starlette 是一个轻量级的 ASGI(Asynchronous Server Gateway Interface)框架/工具集,专为在 Python 中构建高性能异步 Web 服务而设计,其官方口号是 "The little ASGI framework that shines"

  • 产品定位:既可当完整框架使用,也可当 ASGI 工具集——所有组件(路由、请求/响应、中间件、WebSocket、静态文件等)都能独立取出、与任意 ASGI 服务器或组件自由组合。

  • 诞生的背景与原因

    • 2018 年之前,Python Web 生态以同步 WSGI(Django、Flask)为主,异步 Web 能力薄弱。
    • ASGI 规范随 Django Channels 提出,成为 WSGI 的异步继任者,但当时缺少真正纯 ASGI 的轻量框架
    • Tom Christie(Django REST Framework、HTTPX、Uvicorn、MkDocs 的作者)于 2018 年 6 月创建 Starlette,为 Python 异步 Web 奠定基础层。
  • 解决的核心问题

    1. 提供从 WSGI 到 ASGI 迁移的轻量、高性能基础层;
    2. 用极简 API 覆盖路由、WebSocket、中间件、流式响应等高频能力;
    3. 以"一切皆 ASGI"的模块化设计,让组件可跨框架复用,支撑整个 ASGI 生态。

URLs

地址
官网 / 文档 https://www.starlette.io/
GitHub 仓库 https://github.com/Kludex/starlette(原 encode/starlette,已迁移)
PyPI https://pypi.org/project/starlette/
许可证 BSD-3-Clause

发展历程

时间 里程碑
2018-06 Tom Christie 创建 Starlette 0.1
2018-12 Sebastián Ramírez 发布 FastAPI(基于 Starlette 构建),Starlette 随之成为生态地基
2019–2023 FastAPI 爆发式采用,Starlette 作为其底层被全球大量项目依赖
2024 PyPI 日下载量突破 1000 万次里程碑
2024-12 0.45.0 放弃 Python 3.8 支持
2025-11 0.50.0 放弃 Python 3.9 支持(1.x 要求 Python ≥3.10)
2026-02-23 1.0.0rc1 发布,开始移除废弃 API
2026-03-22 1.0.0 正式发布——历经近 8 年的 0.x(ZeroVer)后达成首个稳定版
2026-05-21 1.0.1 修复安全漏洞 CVE-2026-48710(BadHost)
2026-08-08 1.6.0(调研时最新版),持续快速迭代

维护者交接:创始作者 Tom Christie 后逐步将项目交给 Marcelo Trylesinski(GitHub: Kludex,Pydantic 团队成员) 主导维护,仓库也随之从 encode 组织迁移到 Kludex 个人组织下继续开发。

主要功能

  • 轻量级 HTTP Web 框架:路由(Route/Router/Mount/WebSocketRoute)、请求/响应对象、端点(HTTPEndpoint/WebSocketEndpoint);
  • WebSocket 支持:原生长连接、消息收发;
  • 进程内后台任务BackgroundTasks);
  • 启动/关闭生命周期lifespan 异步上下文管理器(1.0 起取代旧 on_startup/on_shutdown);
  • 基于 httpx 的测试客户端TestClient);
  • 中间件体系:CORS、GZip、Session、TrustedHost、HTTPSRedirect 等;
  • 静态文件服务、流式响应、HTTP Range、模板(Jinja2)、Cookie/Session
  • HTTP/2 Server Push、异常处理、配置读取
  • 工程保障:100% 测试覆盖、100% 类型标注;
  • 极少的硬依赖:仅需 anyio;可选 httpxjinja2python-multipartitsdangerouspyyaml
  • 双后端兼容:同时支持 asynciotrio

核心优势

  1. 极简与低复杂度:API 干净、直觉化,各组件可独立理解;
  2. 高性能:独立基准测试中表现优秀,接近 Node.js / Go 的水平;是当前最快的 Python Web 框架之一;
  3. 模块化/工具集哲学:"一切皆 ASGI",组件可跨框架复用,催生共享中间件与可挂载应用的生态;
  4. 依赖极少、体积小:核心仅 anyio 一个硬依赖,可移植性极强;
  5. 工程质量高:100% 测试覆盖 + 100% 类型标注,长期生产验证;
  6. 生态地位:FastAPI 的基石;在 AI 时代还充当 Python MCP SDK 的底层依赖,角色持续放大。

主要短板

  • 无内置数据校验/序列化:需配合 Pydantic 或手工实现;
  • 无自动 API 文档:不生成 OpenAPI/Swagger(FastAPI 才具备);
  • 无内置认证/授权:仅提供中间件原语,需自行实现或引入第三方;
  • 无 ORM / Admin / 全栈能力:定位为微框架,大型业务需自行组装;
  • 不自带服务器:必须搭配 Uvicorn / Daphne / Hypercorn 等 ASGI 服务器运行。

局限性

  • 0.x 时代的 API 稳定性问题:直到 2026 年 1.0 前长期处于 ZeroVer,"API 可随时变化",依赖其 0.x 的项目需谨慎锁版本;
  • 历史安全漏洞(均已修复):
    • GHSA-f96h-pmfr-66vw(0.40.0 修复):multipart/form-data 拒绝服务(DoS);
    • GHSA-7f5h-v6xp-fcq8(0.49.1 修复):FileResponseRange 头解析 DoS;
    • CVE-2026-48710(BadHost,1.0.1 修复):由畸形 Host 头导致 request.url 重建与路由分发不一致,可造成鉴权绕过——使用 request.url.path 做授权判断的中间件需改用 request.scope["path"]
  • BaseHTTPMiddleware 的历史争议:对 StreamingResponse 的转发、后台任务调度等行为曾多次出现性能与语义问题,官方多次修复;
  • 维护力量集中:核心维护者人数少(bus factor 相对较高),依赖社区赞助与少数贡献者

适用场景

  • 构建轻量级异步 HTTP API / 微服务(I/O 密集、高并发);
  • 作为 FastAPI 等上层框架的底层(绝大多数 FastAPI 应用即 Starlette 应用);
  • 需要 WebSocket 长连接 / 流式响应 / SSE 的服务;
  • 需要高性能静态文件托管、模板渲染的轻服务;
  • 作为 ASGI 工具集嵌入自定义架构,与任意 ASGI 服务器/组件组合;
  • GraphQL(需第三方扩展)或希望自行组装技术栈的场景。

同类竞品

框架 协议 定位 与 Starlette 的关系 / 特点
FastAPI ASGI 全功能 API 框架 基于 Starlette + Pydantic 构建;自动 OpenAPI 文档、数据校验、依赖注入
Litestar ASGI 分层 API 框架 对标 FastAPI,内置更多能力,性能强劲
aiohttp 自研异步 全功能异步框架 HTTP 客户端 + 服务端一体,功能更重、非 ASGI 中间件生态
Sanic 自研(非 ASGI) 异步服务器 + 框架 自带服务器、支持 HTTP/3,但与 ASGI 中间件生态不兼容
Falcon WSGI/ASGI 极简高性能 REST 低开销高吞吐,功能面更窄
Quart ASGI Flask 风格异步框架 兼容 Flask API 语法的 ASGI 实现
BlackSheep ASGI 高性能框架 性能导向、自带解析器
Flask WSGI 经典同步微框架 同步、生态成熟,异步需扩展
Django WSGI/ASGI 全栈框架 ORM/Admin/Auth 一体,异步能力需 Channels

发展趋势

  • 社区活跃度:GitHub Star 约 12.6k、Fork 约 1.3k(2026-09);PyPI 日下载量约 1000 万次(2024 年已达);
  • 发布节奏:1.0 后高速迭代(1.0.0 → 1.6.0 仅 4 个多月);正在开发 trie 路由 以进一步提升路由性能;
  • 商业化与赞助:获 tiangolo、huggingface、elevenlabs、roboflow 等赞助支持;
  • AI 时代角色:作为 Python MCP SDK 的底层依赖,在 AI Agent 工具栈中持续渗透;
  • 总结:作为 FastAPI 与整个 Python异步生态的"地基",Starlette 在 1.0 稳定版落地后进入平台成熟期,并借 AI 应用(MCP 等)持续扩张。

Uvicorn 与 Starlette 的关联关系、本质区别

  • 结论:Uvicorn 是 ASGI 服务器(负责跑起来、管网络连接),Starlette 是 ASGI 框架/工具集(负责路由、中间件、请求响应处理)

两者处在 ASGI 协议栈的不同层,通过 ASGI 规范协作,彼此不能互相替代

本质定位

  • Uvicorn = ASGI 服务器

Uvicorn 官方的自我定义就是 "An ASGI web server implementation for Python"。
它干的是底层网络引擎的活:监听端口、解析 HTTP/1.1 和 WebSocket 协议、管理连接和事件循环(基于 asyncio,可选 uvloop + httptools 加速),把收到的字节流翻译成 ASGI 的 scope/receive/send 消息交给上层应用,再把应用的响应转回 HTTP 返回给客户端。
它不提供路由、不提供中间件机制——这些是框架的事。

  • Starlette = 轻量级 ASGI 框架/工具集

Starlette 官方定义自己是 "a lightweight ASGI framework/toolkit, which is ideal for building async web services in Python"。
它提供的是 Web 开发的应用层能力:路由系统、中间件、WebSocket 处理、请求/响应对象、Session/Cookie、CORS、后台任务、测试客户端等。Starlette 本身不是一个服务器,它产出的 app 对象必须交给某个 ASGI 服务器(Uvicorn、Hypercorn、Daphne 等)才能运行——官方文档里也明确写着 "You'll also want to install an ASGI server, such as uvicorn"。

一次请求中的协作关系

  • uvicorn main:app 运行一个 Starlette 应用为例,请求链路是这样的:
浏览器 ──HTTP──> Uvicorn(服务器层)
                    │  解析 HTTP,构造 ASGI scope
                    ▼
                Starlette app(框架层)
                    │  路由匹配 → 中间件栈 → 视图函数
                    │  生成 Response 对象
                    ▼
                Uvicorn(服务器层)
                    │  把响应转回 HTTP 字节流
                    ▼
                浏览器
  • Uvicorn 是"搬运工和调度器",Starlette 是"业务逻辑处理者"。

这也是为什么性能基准上 Uvicorn 比 Starlette 快——框架层多了一层代码路径开销,而【服务器层】只做协议和事件循环调度。

本质区别的对比

维度 Uvicorn Starlette
角色 ASGI 服务器 ASGI 框架/工具集
核心职责 网络连接、协议解析、事件循环 路由、中间件、请求/响应封装
能否独立跑 Web 服务 ✅ 是,可直接对外服务 ❌ 否,必须搭配 ASGI 服务器
是否提供路由 ❌ 不提供 Route / Router
是否处理 WebSocket 业务 只做协议升级和消息转发 ✅ 提供 WebSocket 端点抽象
可替换性 可被 Hypercorn / Daphne / Granian 替换 可被 FastAPI / Sanic 等框架替换

常见误解:Starlette 不是"Uvicorn 的一部分",两者是独立项目、独立仓库、独立版本号。

只是因为它们同为 Encode 组织出品、作者都是 Tom Christie,且 Uvicorn 对 Starlette 应用做了最好的适配,所以开源社区习惯把它们配对使用
实际上 Starlette 应用可以跑在任意 ASGI 服务器上,Uvicorn 也可以跑任意 ASGI 应用(包括 FastAPI、Django Channels 等)。

为什么两者经常一起出现?

  • FastAPI 的官方文档把关系说得很直白:
  • FastAPI 类直接继承自 Starlette 类,Starlette 负责所有核心 Web 部分(路由、中间件、请求/响应);FastAPI 在其上叠加了 Pydantic 数据校验、OpenAPI 文档生成、依赖注入;
  • Uvicorn 是 FastAPI 推荐的 ASGI 服务器。所以,在 FastAPI 技术栈里,三者关系是:
Uvicorn(跑 AWSI Server)  →  FastAPI(框架)  →  Starlette(底层框架基座)

如果你直接用 Starlette 而不用 FastAPI,那就是 Uvicorn + Starlette 两层;如果你用 FastAPI,底层依然踩在 Starlette 上,外面再套 Uvicorn 来运行。

生产环境注意:单机 Uvicorn 一般还要配合 Gunicorn 使用 gunicorn -w 4 -k uvicorn.workers.UvicornWorker 来做【多进程管理】,Uvicorn 自身只管【单进程内的事件循环】。

简单记:Uvicorn 管"跑"和"网络",Starlette 管"写"和"路由"——前者是发动机,后者是底盘,缺一个车都动不了。

类比 Java Web 框架/项目

  • 用 Java Web 生态来类比,能帮助快速建立直觉——但只是"职责类比",不是技术协议上的等价(ASGI 规范和 Servlet 规范是不同的东西)。先把映射关系摆出来:
Python 侧 角色 Java 侧最贴近的对象
Uvicorn ASGI 服务器(跑应用、管网络) Tomcat / Jetty / Undertow(嵌入式 Servlet 容器)
Starlette 轻量 ASGI 框架(路由、中间件) Spring Web / Spring MVC 的 Web 层
FastAPI Starlette + 数据校验 + 文档 Spring Boot Web MVC
(异步非阻塞维度) async/await 事件循环 Spring WebFlux + Netty(响应式栈)

Uvicorn ≈ 嵌入式 Tomcat / Jetty / Undertow

Uvicorn 是 ASGI 服务器实现,负责监听端口、解析 HTTP/WebSocket、管理连接和事件循环,并通过 ASGI 接口把请求交给上层应用。这个定位和 Java 里的 Servlet 容器几乎一一对应:

  • Tomcat / Jetty / Undertow 监听 TCP 端口,把原始 HTTP 字节解析成 HttpServletRequest,管理组件生命周期,再把请求路由到对应的 Servlet
  • 现代 Spring Boot 应用默认内嵌了一个 Tomcat/Jetty/Undertow,应用自己启动自己的容器——这和 uvicorn main:app 启动 Starlette/FastAPI 应用是同一个心智模型

如果想找一个更底层、更贴近"纯网络引擎"的 Java 对应物,那是 Netty——异步、事件驱动、工作在 Channel/Buffer 层面,不绑定 Servlet 规范,是 Spring WebFlux、Micronaut、Quarkus 等现代响应式框架的基石。

Starlette ≈ Spring Web / Spring MVC 的 Web 层

Starlette 提供路由、中间件、WebSocket、请求/响应封装等 Web 开发的应用层能力。对应到 Java 侧:

  • Spring MVCDispatcherServlet + @RequestMapping + HandlerInterceptor(中间件等价物)+ HttpMessageConverter,正是这一层
  • 它们都构建在底层容器之上,依靠容器提供的运行时契约

如果把视角切到异步非阻塞这条线:

  • Starlette / FastAPIasync def 路由 + Uvicorn 事件循环)≈ Spring WebFlux + Netty(Mono/Flux 响应式返回 + Netty 事件循环)
  • 两者都是"为异步而生的现代 Web 框架",都可以在单线程事件循环上实现高并发

FastAPI ≈ Spring Boot Web MVC

FastAPI = Starlette(Web 层)+ Pydantic(数据校验)+ 自动 OpenAPI 文档 + 依赖注入。这个组合在 Java 侧最接近的完整产物是:

Spring Boot Web MVC = Tomcat(嵌入式容器)+ Spring Web(Web 层)+ Bean Validation(数据校验)+ Spring 生态(DI)

两者都是"在轻量框架之上做一层【生产级封装】,让开发者【开箱即用】"。

一图理清分层

┌─────────────────────────────────────────────────┐
│  Python 技术栈              Java 技术栈           │
│                                                 │
│  Uvicorn (ASGI 服务器)      Tomcat/Jetty/Undertow│  ← 容器/服务器层
│  ─────────────────────      ───────────────────  │
│  Starlette (ASGI 框架)     Spring Web/MVC        │  ← Web 框架层
│  ─────────────────────      ───────────────────  │
│  FastAPI (API 框架)        Spring Boot Web MVC   │  ← 生产级封装
│                              (或 WebFlux+Netty)   │
│                                                 │
│  ASGI 规范                    Servlet 规范         │  ← 中间契约
└─────────────────────────────────────────────────┘

容易混淆的点

  • 别把 Uvicorn 类比成 Nginx

Nginx 是纯粹的 Web 服务器,主要处理静态资源、反向代理、TLS 终止,它本身不能执行应用代码
而 Uvicorn 是直接托管并执行 Python ASGI 应用的——这个角色在 Java 侧是 Tomcat/Jetty,不是 Nginx。
生产环境常见的 Nginx → Uvicorn → Starlette 三层架构,对应 Java 的 Nginx → Tomcat → Spring MVC

  • ASGI ≠ Servlet

ASGI 是异步服务器网关接口,基于 asyncio 事件循环;Servlet 规范是基于【线程池模型】的同步契约(虽然 Servlet 3.1+ 引入了异步支持)。

所以"Uvicorn 是 ASGI 世界的 Tomcat"这个说法在职责上成立,但在并发模型上,Tomcat 默认是【线程池】,Uvicorn 是【事件循环】——真正并发模型对等的是 Netty

  • Gunicorn + Uvicorn Worker 这种"多进程管理器 + ASGI Worker"的模式,在 Java 世界没有特别直接的对应,因为 JVM 本身就是【多线程】的,不需要像 Python 那样靠【多进程】绕过 GIL。

这一层是 Python 特有的产物。

小结:Uvicorn 站在 Tomcat/Jetty 的位置,Starlette 站在 Spring Web 的位置,FastAPI 站在 Spring Boot Web MVC 的位置——理解了 Java Web 的分层,也就理解了 Python ASGI 技术栈的分层。

2 工作原理与架构

概念术语

术语 说明
ASGI Asynchronous Server Gateway Interface,WSGI 的异步继任协议;支持 HTTP、WebSocket、HTTP/2、SSE 等
scope / receive / send ASGI 应用的三要素:scope 为请求元数据字典(type/method/path/headers 等);receive 异步读取请求体;send 异步发送响应事件
ASGI 应用 任意形如 async def app(scope, receive, send) 的可调用对象
中间件 包裹下层应用、在请求前后横切处理(鉴权、日志、CORS 等)的 ASGI 可调用对象
路由 / 挂载 Route(路径路由)、Mount(子应用挂载)、WebSocketRoute
lifespan 应用启动/关闭生命周期协议,管理资源初始化与清理
工具集(toolkit) Starlette 的核心理念:各组件可脱离框架独立使用

架构与运行原理

Starlette 的架构核心思想是 "一切皆 ASGI"(everything is just ASGI)ApplicationRouterMiddlewareStaticFilesResponse 等每个组件本身都是一个 ASGI 应用,可被独立调用、组合或挂载。这使得组件可以跨任何 ASGI 框架复用。

请求处理流程

flowchart LR A[客户端 HTTP/WS 请求] --> B[ASGI 服务器<br/>Uvicorn / Daphne / Hypercorn] B -->|解析为 scope / receive / send| C[Starlette Application<br/>__call__] C --> D[中间件栈<br/>CORS / GZip / Session / TrustedHost ...] D --> E[Router 路由匹配] E -->|Route 匹配| F[Endpoint 端点处理<br/>HTTPEndpoint / 函数端点] F -->|构造 Response| G[Response<br/>JSON / Streaming / File ...] G -->|send 事件| H[返回客户端]
  1. ASGI 服务器(如 Uvicorn)接收原始 HTTP/WebSocket 连接,解析为 scope,并提供 receive/send 通道;
  2. Starlette.__call__app 注入 scope,随后调用 middleware_stack 开始请求处理;
  3. 中间件栈按声明顺序包裹应用,进行横切处理
  4. 路由系统根据路径与 HTTP 方法匹配 Route/Mount/WebSocketRoute,分发到端点;
  5. 端点(异步函数或 HTTPEndpoint 类)处理业务逻辑,构造 Response
  6. 通过 send 发送 http.response.start / http.response.body 事件返回客户端

生命周期(lifespan):1.0 起使用异步上下文管理器统一管理启动/关闭。在 lifespan 启动完成前不会处理任何请求;关闭动作在所有连接关闭、进程内后台任务完成后执行。state 字典可在 lifespan 与各请求间共享对象(如数据库连接池、HTTP 客户端)。

3 使用指南

安装部署(Windows / Linux)

Starlette 通过 pip 安装,Windows 与 Linux 命令完全一致(要求 Python ≥ 3.10):

# 安装 Starlette 本体(核心仅依赖 anyio)
pip install starlette

# 安装全部可选功能(httpx / jinja2 / python-multipart / itsdangerous / pyyaml)
pip install starlette[full]

# 安装 ASGI 服务器(三选一)
pip install uvicorn      # 最常用、性能最优
# pip install hypercorn  # 支持 HTTP/2
# pip install daphne

推荐在虚拟环境(venv / conda)中安装。生产环境建议固定版本,如 pip install starlette==1.6.0

关键操作

1. 最小可运行示例

  • 编写 web_server.py

https://github.com/Kludex/starlette

# web_server.py
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route

async def homepage(request):
    return JSONResponse({'hello': 'world'})

routes = [
    Route("/", endpoint=homepage)
]

app = Starlette(debug= True, routes= routes)
  • 启动
# 启动(-w 指定 worker 数,--reload 开发热重载)
uvicorn web_server:app --reload --port 8000
  • 调用
PS F:\Codes\Local> curl -v http://127.0.0.1:8000/
详细信息: GET http://127.0.0.1:8000/ with 0-byte payload
详细信息: received 17-byte response of content type application/json                                                                              

StatusCode        : 200
StatusDescription : OK
Content           : {"hello":"world"}
RawContent        : HTTP/1.1 200 OK
                    Content-Length: 17
                    Content-Type: application/json
                    Date: Mon, 07 Sep 2026 06:42:45 GMT
                    Server: uvicorn

                    {"hello":"world"}
Forms             : {}
Headers           : {[Content-Length, 17], [Content-Type, application/json], [Date, Mon, 07 Sep 2026 06:42:45 GMT], [Server, uvicorn]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 17

2. 生命周期与状态共享

import contextlib
import httpx
from starlette.applications import Starlette
from starlette.requests import Request
from starlette.responses import PlainTextResponse
from starlette.routing import Route

@contextlib.asynccontextmanager
async def lifespan(app):
    async with httpx.AsyncClient() as client:    # 启动时创建
        yield {"http_client": client}            # 共享给请求
    # 关闭时自动清理

async def homepage(request: Request):
    client = request.state.http_client
    resp = await client.get("https://www.example.com")
    return PlainTextResponse(resp.text)

app = Starlette(lifespan=lifespan, routes=[Route("/", homepage)])

3. 中间件(以 CORS 为例)

from starlette.applications import Starlette
from starlette.middleware import Middleware
from starlette.middleware.cors import CORSMiddleware

app = Starlette(
    routes=[...],
    middleware=[
        Middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"])
    ],
)

4. 测试

from starlette.testclient import TestClient
from main import app

def test_homepage():
    with TestClient(app) as client:     # 进入 with 块会触发 lifespan
        r = client.get("/")
        assert r.status_code == 200

Z FAQ for Starlette

Q: Starlette 与 FastAPI 到底是什么关系?

FastAPI 是 Starlette 的子类,直接构建在 Starlette 之上(同时叠加 Pydantic 做数据校验、自动生成 OpenAPI 文档、内置依赖注入)。

因此"每个 FastAPI 应用本质上也是一个 Starlette 应用",FastAPI 拥有 Starlette 的全部能力,且性能不可能超过 Starlette(多了一层校验/文档逻辑)。

Q: Starlette 需要哪个 Python 版本?

当前 1.x 要求 Python ≥ 3.10。0.45 之前支持 Python 3.8,0.45 放弃 3.8,0.50 起放弃 3.9。官方已适配到 Python 3.13 / 3.14。

Q: Starlette 1.0 有哪些破坏性变更?

主要移除了一批废弃 API:on_startup/on_shutdown/on_event()/add_event_handler() 全部改为 lifespan 参数;移除 @app.route()/@app.websocket_route()/@app.exception_handler()/@app.middleware() 装饰器(改用 routes/exception_handlers/middleware 参数);TemplateResponse 旧签名 (name, context) 改为 (request, name, ...)

Jinja2 模板默认开启 autoescape。FastAPI 生态在 1.0 发布后已做适配。

Q: 如何选择用 Starlette 还是 FastAPI?

  • 需要自动校验、自动 API 文档、依赖注入、团队追求开箱即用 → 选 FastAPI
  • 追求极致精简、完全掌控请求解析、只想要轻量路由/WebSocket/中间件、自己组装技术栈 → 直接用 Starlette(或选 Litestar 等分层框架)。

Q: Starlette 支持哪些服务器?

Uvicorn(性能最优、最常用)、DaphneHypercorn(支持 HTTP/2)。Starlette 本身不内置服务器。

Q: Starlette 有已知安全漏洞吗?

历史上公开过 3 个并均已修复:multipart DoS(0.40.0)、Range 头 DoS(0.49.1)、CVE-2026-48710 BadHost 鉴权绕过(1.0.1)。生产环境务必升级到最新版本;尤其使用 request.url.path 做鉴权的中间件应改用 request.scope["path"]

Y 推荐文献

X 参考文献

posted @ 2026-09-07 15:02  千千寰宇  阅读(16)  评论(0)    收藏  举报