Starlette

https://pypi.org/project/starlette/
Starlette 是一个轻量级、高性能的 ASGI(Asynchronous Server Gateway Interface) 框架,专为构建异步 Web 应用、API 和微服务设计。它以简洁的 API、异步原生支持和可扩展性著称,常与 FastAPI(基于 Starlette 构建)、Uvicorn(ASGI 服务器)等工具配合使用。

核心特性

  1. 异步原生
    完全基于 Python 的 async/await 语法,支持异步请求处理、WebSocket、HTTP/2 等现代 Web 特性,性能优于传统同步框架(如 Flask)。

  2. 轻量级且灵活
    核心代码简洁(约 6k 行),无强制依赖(仅需 anyio 处理异步 I/O),可按需扩展功能(如会话、认证、模板渲染)。

  3. 丰富的功能支持

    • 路由系统(支持路径参数、正则匹配)
    • WebSocket 双向通信
    • HTTP/2 与服务器推送
    • 中间件(Middleware)机制
    • 测试客户端(内置 TestClient
    • 静态文件服务
    • 请求/响应对象封装(支持表单、JSON、文件上传)
  4. 高性能
    底层基于 ASGI,配合 Uvicorn 或 Hypercorn 等服务器,性能接近 Node.js 或 Go 编写的服务。

安装

pip install starlette
# 如需WebSocket或表单处理,需安装额外依赖
pip install starlette[full]

快速入门示例

from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route

async def homepage(request):
    return JSONResponse({"message": "Hello, Starlette!"})

async def user_profile(request):
    username = request.path_params["username"]
    return JSONResponse({"username": username})

app = Starlette(
    routes=[
        Route("/", homepage),
        Route("/user/{username}", user_profile),
    ]
)

运行服务(需安装 Uvicorn):

uvicorn main:app --reload

典型应用场景

  • 构建高性能异步 API
  • WebSocket 实时应用(如聊天、通知)
  • 微服务架构中的轻量级服务
  • 与 FastAPI 结合(FastAPI 复用了 Starlette 的核心功能,并增加了自动文档、数据验证等)

与其他框架的对比

  • Flask/Django:Starlette 是异步原生的,更适合 I/O 密集型场景(如数据库查询、外部 API 调用)。
  • FastAPI:FastAPI 基于 Starlette,专注于 API 开发(自动生成 OpenAPI 文档、Pydantic 数据验证),而 Starlette 更通用。
  • Sanic:Starlette 更轻量,生态更简洁,Sanic 则提供更多内置功能。

扩展生态

Starlette 可通过第三方库扩展:

  • jinja2:模板渲染
  • python-multipart:表单处理
  • itsdangerous:会话管理
  • httpx:异步 HTTP 客户端

总之,Starlette 是构建现代异步 Web 应用的高效选择,尤其适合需要高性能和灵活性的场景。

contextlib

contextlib 是 Python 标准库中的模块,专为上下文管理器(Context Manager)设计,提供了简洁、灵活的方式来创建和使用上下文管理器,常用于资源管理(如文件、网络连接、锁)、异常处理、临时环境设置等场景。

上下文管理器的核心是实现 __enter__()__exit__() 方法,而 contextlib 通过装饰器、工具函数等简化了这一过程,无需手动定义类。

核心功能与常用工具

1. @contextmanager 装饰器

最常用的工具,可将生成器函数直接转换为上下文管理器,无需编写完整的类。

  • 生成器中 yield 之前的代码相当于 __enter__() 方法(进入上下文时执行);
  • yield 之后的代码相当于 __exit__() 方法(退出上下文时执行,即使发生异常也会执行)。

示例:自定义文件读取上下文管理器

from contextlib import contextmanager

@contextmanager
def open_file(file_path, mode='r'):
    # __enter__ 逻辑
    f = open(file_path, mode)
    try:
        yield f  # 返回资源给 with 语句
    finally:
        # __exit__ 逻辑(确保资源释放)
        f.close()

# 使用
with open_file('test.txt') as f:
    print(f.read())

2. closing() 函数

用于包装实现了 close() 方法的对象,使其成为上下文管理器,退出时自动调用 close()
适用于没有原生支持上下文管理的资源(如网络连接、数据库连接)。

示例:关闭网络连接

from contextlib import closing
import urllib.request

with closing(urllib.request.urlopen('https://www.python.org')) as page:
    for line in page:
        print(line)
# 自动调用 page.close()

3. suppress() 函数

用于忽略指定的异常,避免手动编写 try-except 块。
进入上下文时若发生指定异常,会直接忽略并继续执行后续代码。

示例:忽略文件不存在异常

from contextlib import suppress

# 忽略 FileNotFoundError,不会报错
with suppress(FileNotFoundError):
    with open('nonexistent.txt') as f:
        print(f.read())

print("继续执行...")

4. redirect_stdout() / redirect_stderr()

用于重定向标准输出/标准错误到指定文件或对象,常用于日志记录、测试输出捕获。

示例:重定向打印输出到文件

from contextlib import redirect_stdout

with open('output.txt', 'w') as f:
    with redirect_stdout(f):
        print("Hello, contextlib!")  # 输出写入 output.txt

5. ExitStack

用于动态管理多个上下文管理器,适合上下文数量不确定的场景(如同时打开多个文件)。
通过 enter_context() 逐个添加上下文,退出时自动逆序关闭所有资源。

示例:动态打开多个文件

from contextlib import ExitStack

files = ['a.txt', 'b.txt', 'c.txt']
with ExitStack() as stack:
    # 逐个添加文件上下文,自动管理
    f_handles = [stack.enter_context(open(f, 'w')) for f in files]
    for f in f_handles:
        f.write('Hello!')
# 所有文件自动关闭

应用场景

  • 资源管理:文件、网络连接、数据库连接的自动关闭;
  • 异常处理:简化 try-except 逻辑,忽略特定异常;
  • 环境临时修改:如临时重定向输出、修改系统配置;
  • 动态上下文管理:处理数量不确定的上下文资源。

总结

contextlib 大幅简化了上下文管理器的创建和使用,避免了重复的 try-finally 代码,让资源管理更简洁、优雅。无论是自定义上下文,还是复用现有对象,它都是 Python 中处理“进入-退出”逻辑的首选工具。

uvicorn

Uvicorn 是一个高性能的 ASGI(Asynchronous Server Gateway Interface)服务器,专为运行异步 Python Web 应用设计,是 Starlette、FastAPI、Quart 等异步框架的首选服务器。它基于 uvloop(高性能事件循环)和 httptools(HTTP 解析工具)构建,性能接近 Node.js 或 Go 编写的服务器。

核心特性

  1. 异步原生支持
    完全兼容 ASGI 3 规范,支持异步请求处理、WebSocket、HTTP/1.1、HTTP/2 以及服务器推送(Server Push)。

  2. 高性能

    • 使用 uvloop 替代 Python 标准库的 asyncio 事件循环(性能提升约 2-4 倍);
    • 基于 httptools 实现快速 HTTP 解析,处理请求的效率极高。
  3. 易用性
    命令行启动简单,支持热重载(开发模式)、配置文件、SSL/TLS 等功能。

  4. 兼容性
    可作为 Gunicorn 的 worker 运行(多进程 + 异步),也可单独作为单进程服务器使用。

安装

# 基础安装
pip install uvicorn

# 完整安装(包含 uvloop 和 httptools,提升性能)
pip install uvicorn[standard]

快速使用

1. 运行简单的 ASGI 应用

创建一个简单的 ASGI 应用(app.py):

async def app(scope, receive, send):
    assert scope['type'] == 'http'
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [(b'content-type', b'text/plain')],
    })
    await send({
        'type': 'http.response.body',
        'body': b'Hello, Uvicorn!',
    })

启动服务器:

uvicorn app:app --reload  # --reload 开发模式,代码修改自动重启

访问 http://127.0.0.1:8000,即可看到响应。

2. 运行 Starlette/FastAPI 应用

以 FastAPI 为例(main.py):

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello, FastAPI + Uvicorn!"}

启动服务器:

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
  • --host 0.0.0.0:允许外部访问;
  • --port 8000:指定端口;
  • --workers 4:启动 4 个 worker 进程(多核利用)。

常用命令行参数

参数 作用
--reload 开发模式,文件修改自动重启
--host 绑定主机地址(默认 127.0.0.1
--port 绑定端口(默认 8000
--workers 启动的 worker 进程数(推荐设置为 CPU 核心数)
--ssl-keyfile SSL 私钥文件路径(启用 HTTPS)
--ssl-certfile SSL 证书文件路径(启用 HTTPS)
--log-level 日志级别(debug/info/warning/error

生产环境部署

生产环境中,通常结合 Gunicorn(进程管理器)和 Uvicorn(worker)使用,兼顾多进程和异步性能:

# 安装 Gunicorn
pip install gunicorn

# 启动:Gunicorn 作为主进程,Uvicorn 作为 worker
gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000

与其他服务器的对比

  • Gunicorn:WSGI 服务器,不支持异步;可搭配 Uvicorn worker 实现异步支持。
  • Hypercorn:另一个 ASGI 服务器,支持 HTTP/3,功能与 Uvicorn 类似,但性能稍弱。
  • Daphne:由 Django 团队开发的 ASGI 服务器,兼容性好,但性能低于 Uvicorn。

总结

Uvicorn 是异步 Python Web 应用的高性能服务器,兼具易用性和扩展性,是 Starlette、FastAPI 等框架的标配。开发时用 --reload 提升效率,生产环境结合 Gunicorn 实现多进程部署,可充分发挥异步应用的性能优势。

标签: none 阅读量: 15

添加新评论