ASGI
在 Python3.5 之後增加 async/await 特性之後,非同步程式設計變得異常火爆,越來越多開發者投入非同步的懷抱。
直到最近,Python 仍缺乏用於 asyncio 框架的最低限度的低階伺服器/應用程式介面。
而 ASGI 協議規範的出現填補了這一空白,這意味著我們現在能夠開始構建可在所有非同步框架中使用的通用工具集
ASGI(非同步伺服器閘道器介面)是WSGI的精神繼承者,旨在在具有非同步功能的Python Web伺服器,框架和應用程式之間提供標準介面。
”
有關同步生態中的伺服器及 WSGI 請檢視文末推薦的以前寫的相關文章
ASGI 伺服器UvicornUvicorn 是一個快速的 ASGI 伺服器,Uvicorn 是基於 uvloop 和 httptools 構建的,是 Python 非同步生態中重要的一員。
Uvicorn 當前支援 HTTP / 1.1 和 WebSockets,將來計劃支援HTTP / 2。
版本要求 Python 3.5 以上,Uvicorn 的安裝,
pip install uvicorn
我們可以自己編寫一個非同步的服務,同時使用 uvicorn 來執行,比如新建一個 demo.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, world!', })
執行命令如下,
uvicorn demo:app
服務啟動之後,我們通過瀏覽器就能方位該服務,預設埠 8000
DaphneDaphne 伺服器是最早為 Django Channels 提供支援的 ASGI 伺服器
Daphne 它在生產中廣泛執行,並支援HTTP / 1.1,HTTP / 2和 WebSockets。
安裝和執行的命令如下:
pip install daphnedaphne app:App
和 uvicorn 命令類似,app 是檔名稱,APP 是應用程式
HypercornHypercorn 最初是框架 Quart 的一部分,然後被分離為獨立的 ASGI 伺服器
同樣的,Hypercorn 支援 HTTP/1.1, HTTP/2, 以及 WebSockets.
安裝和執行的命令如下:
pip install hypercornhypercorn app:App
說了 ASGI 伺服器,接下來就是支援 ASGI 的框架了
ASGI 框架您可以使用 Uvicorn,Daphne 或 Hypercorn 執行任何 ASGI 框架
對於小型服務,您也可以直接編寫 ASGI 應用程式。例如之前編寫的非同步框架。
Python 中有以下幾個支援 ASGI 的非同步框架
StarletteStarlette 是一個輕量級的 ASGI 框架/工具包。它是構建高效能非同步服務的理想選擇,並且支援 HTTP 和 WebSockets。
Django ChannelsASGI 規範最初是設計就是用於 Django Channels 的。
Channels 與其他ASGI框架略有不同,它線上程框架後端上提供了非同步前端。
同時 Django Channels 支援 WebSocket,後臺任務和長期執行的連線,而應用程式程式碼仍在標準執行緒上下文中執行
QuartQuart 是一個類似於 Flask 的 ASGI Web 框架。Quart 不僅與 Flask 相似,而且與 Flask API 相容!
該框架的作者希望保留了Flask 的風格,只是向其中新增非同步、WebSocket 和 HTTP 2支援。
因此,你可以從 Flask 文件中學習 Quart 的用法,只需要記住 Quart 中的函式是非同步的就行。
一個簡單的 Quart 服務:
from quart import Quartapp = Quart(__name__)@app.route('/')async def hello(): return 'hello'app.run()
和 Flask 是不是很像,只是多了一個非同步 async
由於 Quart 是從 Flask 中演進過來的,因此 Flask 的所有功能均可用:路由,中介軟體,會話,模板,藍圖等
FastAPI 是一個基於 Starlette 和 Pydantic 的 API 框架,其靈感來自以前的 APISta 伺服器版本
您可以使用 Python 3.6+ 型別宣告編寫 API 函式引數,並獲得自動資料轉換,資料驗證。
FastApi 最主要的特點是快,非常高的效能,向 NodeJS 和 Go 看齊,現有最快的Python框架之一
同時它可以自動生成互動式 API 文件 UI,編寫 API 介面後,你就可以使用符合標準的 UI 如 SwaggerUI,ReDoc 等來使用 API。