一、Uvicorn簡介
Uvicorn是一個快速、輕量級的Python ASGI伺服器,使用uvloop和httptools實現高性能的HTTP、WebSocket、static file和ASGI應用程序服務。
它採用asynchronous I/O,利用Python 3.6+ 的asyncio庫,同時支持http 1.1和http 2協議,這使得與任何現代Web瀏覽器和Web框架無縫集成。
Uvicorn的特點包括:
1)支持HTTP/1.x和HTTP/2(通過h11庫提供H2支持)
2)自動化WebSocket支持(使用websockets)
3)自動Gzip壓縮控制
4)靜態文件服務
5)工作線程的預先派生(Pre-forking),適用於多核伺服器
6)支持非同步應用程序,包括託管在asyncio中的Wsgi應用程序(使用AsgiToWsGi)
7)使用uvloop實現了一些對性能的優化
二、安裝Uvicorn
在安裝Uvicorn之前,先需要安裝Python 3.6或更高版本,以及pip工具。
1)使用pip命令安裝Uvicorn:
pip install uvicorn
2)檢查是否安裝成功:
uvicorn --version
三、Uvicorn應用實例
1. HelloWorld 示例
首先我們來看一個最基本的Uvicorn示例:
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
這個示例創建了一個基於FastAPI框架的應用程序,監聽在本地IP地址的8000埠上,訪問http://localhost:8000/返回Hello World。
2. 靜態文件服務示例
Uvicorn支持靜態文件服務,默認情況下在項目根目錄下public目錄,可以在Uvicorn的運行參數中配置。
import uvicorn
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
app = FastAPI()
app.mount("/public", StaticFiles(directory="public"), name="public")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
啟動之後,訪問 http://localhost:8000/public/index.html 將返回static文件夾下的index.html文件。
3. WebSocket 示例
Uvicorn還支持WebSocket服務的實現。下面是一個返回當前時間的WebSocket例子:
import asyncio
import uvicorn
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws/{websocket_id}")
async def websocket_endpoint(websocket: WebSocket, websocket_id: int):
await websocket.accept()
while True:
await websocket.send_text(f"{websocket_id}: {datetime.utcnow().isoformat()}")
if __name__ == "__main__":
uvicorn.run(
app,
host="0.0.0.0",
port=8000,
ws=True, # 啟用 WebSocket
ws_handler=websocket_endpoint) # 設置 WebSocket 事件處理函數
啟動之後,可以使用WebSocket客戶端連接:ws://localhost:8000/ws/1。
四、總結
Uvicorn是一個快速、輕量級且功能強大的Python ASGI伺服器,基於Python 3.6+的asyncio庫,同時支持HTTP/1.x和HTTP/2,自動化WebSocket支持和靜態文件服務,為Python的Web開發提供了更方便、高效、可擴展的工具。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/297120.html