python用作服务的库
Starlette
https://pypi.org/project/starlette/
Starlette 是一个轻量级、高性能的 ASGI(Asynchronous Server Gateway Interface) 框架,专为构建异步 Web 应用、API 和微服务设计。它以简洁的 API、异步原生支持和可扩展性著称,常与 FastAPI(基于 Starlette 构建)、Uvicorn(ASGI 服务器)等工具配合使用。
核心特性
-
异步原生
完全基于 Python 的async/await语法,支持异步请求处理、WebSocket、HTTP/2 等现代 Web 特性,性能优于传统同步框架(如 Flask)。 -
轻量级且灵活
核心代码简洁(约 6k 行),无强制依赖(仅需anyio处理异步 I/O),可按需扩展功能(如会话、认证、模板渲染)。 -
丰富的功能支持
- 路由系统(支持路径参数、正则匹配)
- WebSocket 双向通信
- HTTP/2 与服务器推送
- 中间件(Middleware)机制
- 测试客户端(内置
TestClient) - 静态文件服务
- 请求/响应对象封装(支持表单、JSON、文件上传)
-
高性能
底层基于 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 编写的服务器。
核心特性
-
异步原生支持
完全兼容 ASGI 3 规范,支持异步请求处理、WebSocket、HTTP/1.1、HTTP/2 以及服务器推送(Server Push)。 -
高性能
- 使用
uvloop替代 Python 标准库的asyncio事件循环(性能提升约 2-4 倍); - 基于
httptools实现快速 HTTP 解析,处理请求的效率极高。
- 使用
-
易用性
命令行启动简单,支持热重载(开发模式)、配置文件、SSL/TLS 等功能。 -
兼容性
可作为 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 实现多进程部署,可充分发挥异步应用的性能优势。