更多Python学习内容:ipengtao.com
在构建现代Web应用程序时,性能和并发能力是重要的考量因素。传统的WSGI服务器已无法满足异步Web框架的需求,而ASGI(Asynchronous Server Gateway Interface)成为新一代Web服务器接口的标准。Uvicorn 是一个快速、轻量级的ASGI服务器,支持异步Web框架(如FastAPI和Starlette)以及HTTP/2和WebSocket。Uvicorn 基于 uvloop 和 httptools 构建,具有高性能、易用性和灵活性的特点。
安装
要开始使用 Uvicorn,首先需要安装它。
可以通过 pip 安装:
pip install uvicorn
为了获得最佳性能,可以安装带Cython优化的版本:
pip install "uvicorn[standard]"
安装完成后,可以通过以下命令验证安装是否成功:
uvicorn –version
主要功能
-
支持ASGI协议:完全兼容ASGI标准,可以运行异步和同步的Web应用。
-
高性能:基于 uvloop 和 httptools,支持高吞吐量和低延迟。
-
支持HTTP/2和WebSocket:满足现代Web应用的实时通信需求。
-
热重载:开发模式下支持代码热重载,提升开发效率。
-
灵活的配置:通过命令行参数或Python代码自定义运行选项。
这些功能使 Uvicorn 成为构建高性能Web应用的理想选择。
基础用法
运行简单的ASGI应用
以下是一个最简单的ASGI应用示例:
async def app(scope, receive, send):
assert scope['type'] == 'http'
response = b"Hello, Uvicorn!"
await send({
'type': 'http.response.start',
'status': 200,
'headers': [(b'content-type', b'text/plain')],
})
await send({
'type': 'http.response.body',
'body': response,
})
使用 Uvicorn 运行该应用:
uvicorn app:app –host 127.0.0.1 –port 8000
打开浏览器访问 http://127.0.0.1:8000,将显示 “Hello, Uvicorn!”。
集成异步Web框架
Uvicorn 常与异步Web框架(如FastAPI)一起使用。
以下是一个集成FastAPI的示例:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Welcome to Uvicorn with FastAPI!"}
运行该应用:
uvicorn main:app –reload
–reload 参数启用代码热重载功能,每次修改代码后服务器将自动重启。
自定义运行参数
Uvicorn 支持通过命令行或Python代码自定义运行参数。
例如,可以启用HTTP/2支持或设置工作线程数:
uvicorn main:app –host 0.0.0.0 –port 8080 –http h11 –workers 4
也可以通过Python脚本运行:
import uvicorn
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8080, workers=4)
进阶用法
日志配置
Uvicorn 提供了灵活的日志配置选项,可以通过 –log-level 参数设置日志级别:
uvicorn main:app –log-level debug
如果需要自定义日志格式,可以在Python脚本中配置:
import logging
import uvicorn
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, format="%(asctime)s – %(message)s")
uvicorn.run("main:app", log_level="info")
启用SSL支持
Uvicorn 支持HTTPS,通过指定SSL证书和私钥即可启用:
uvicorn main:app –ssl-keyfile key.pem –ssl-certfile cert.pem
这在需要保护敏感数据的场景中非常有用。
使用自定义中间件
Uvicorn 支持自定义中间件来扩展ASGI应用的功能。
例如,可以创建一个简单的日志中间件:
class LogMiddleware:
def __init__(self, app):
self.app = app
async def __call__(self, scope, receive, send):
print(f"New request: {scope['path']}")
await self.app(scope, receive, send)
async def app(scope, receive, send):
assert scope['type'] == 'http'
response = b"Hello, Middleware!"
await send({
'type': 'http.response.start',
'status': 200,
'headers': [(b'content-type', b'text/plain')],
})
await send({
'type': 'http.response.body',
'body': response,
})
app = LogMiddleware(app)
运行上述代码后,服务器将记录每个请求的路径。
多进程模式
在高并发场景下,可以通过 –workers 参数启用多进程模式,以提升性能:
uvicorn main:app –workers 4
每个进程将独立处理请求,有助于充分利用多核CPU。
实际应用
构建实时聊天应用
以下是一个简单的WebSocket聊天应用:
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/chat")
async def chat(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Message received: {data}")
运行该应用并使用WebSocket客户端测试,即可实现实时消息交互。
开发高性能API服务
通过 Uvicorn 和 FastAPI,可以快速构建一个高性能的RESTful API:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
运行后可以通过 curl 或其他工具测试:
curl "http://127.0.0.1:8000/items/42?q=test"
返回结果:
{
"item_id": 42,
"q": "test"
}
部署机器学习模型
Uvicorn 常用于部署机器学习模型。
以下示例展示了如何将一个预训练的模型暴露为API:
from fastapi import FastAPI
import joblib
app = FastAPI()
model = joblib.load("model.pkl")
@app.post("/predict")
async def predict(features: dict):
prediction = model.predict([list(features.values())])
return {"prediction": prediction[0]}
通过 Uvicorn 运行该服务,即可将机器学习模型集成到应用中。
总结
Uvicorn 是一个高性能的ASGI服务器,专为支持现代异步Web框架而设计,如FastAPI和Starlette。它基于 uvloop 和 httptools,具有快速响应、高并发处理能力以及对HTTP/2和WebSocket的原生支持。作为轻量级服务器,Uvicorn 提供了灵活的配置选项,包括多进程模式、SSL支持和自定义日志配置等,同时支持代码热重载,大大提高了开发效率。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
我们还为大家准备了Python资料,感兴趣的小伙伴快来找我领取一起交流学习哦!
往期推荐
Python基础学习常见的100个问题.pdf(附答案)
Python办公自动化完全指南(免费PDF)
Python Web 开发常见的100个问题.PDF
Beautiful Soup快速上手指南,从入门到精通(PDF下载)
124个Python案例,完整源代码!
80个Python数据分析必备实战案例.pdf(附代码),完全开放下载
120道Python面试题.pdf ,完全版开放下载
全网最全 Pandas的入门与高级教程全集,都在这里了!(PDF下载)
点击下方“阅读原文”查看更多
评论前必须登录!
注册