Python 異步 ASGI 服務(wù)器及框架
ASGI
在 Python3.5 之后增加 async/await 特性之后,異步編程變得異常火爆,越來越多開發(fā)者投入異步的懷抱。
直到最近,Python 仍缺乏用于 asyncio 框架的最低限度的低級(jí)服務(wù)器/應(yīng)用程序接口。
而 ASGI 協(xié)議規(guī)范的出現(xiàn)填補(bǔ)了這一空白,這意味著我們現(xiàn)在能夠開始構(gòu)建可在所有異步框架中使用的通用工具集
ASGI(異步服務(wù)器網(wǎng)關(guān)接口)是WSGI的精神繼承者,旨在在具有異步功能的Python Web服務(wù)器,框架和應(yīng)用程序之間提供標(biāo)準(zhǔn)接口。
ASGI 服務(wù)器
Uvicorn
Uvicorn 是一個(gè)快速的 ASGI 服務(wù)器,Uvicorn 是基于 uvloop 和 httptools 構(gòu)建的,是 Python 異步生態(tài)中重要的一員。
Uvicorn 當(dāng)前支持 HTTP / 1.1 和 WebSockets,將來計(jì)劃支持HTTP / 2。
版本要求 Python 3.5 以上,Uvicorn 的安裝,
pip install uvicorn
我們可以自己編寫一個(gè)異步的服務(wù),同時(shí)使用 uvicorn 來運(yùn)行,比如新建一個(gè) 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!', })
運(yùn)行命令如下,
uvicorn demo:app
服務(wù)啟動(dòng)之后,我們通過瀏覽器就能方位該服務(wù),默認(rèn)端口 8000
Daphne
Daphne 服務(wù)器是最早為 Django Channels 提供支持的 ASGI 服務(wù)器
Daphne 它在生產(chǎn)中廣泛運(yùn)行,并支持HTTP / 1.1,HTTP / 2和 WebSockets。
安裝和運(yùn)行的命令如下:
pip install daphne daphne app:App
和 uvicorn 命令類似,app 是文件名稱,APP 是應(yīng)用程序
Hypercorn
Hypercorn 最初是框架 Quart 的一部分,然后被分離為獨(dú)立的 ASGI 服務(wù)器
同樣的,Hypercorn 支持 HTTP/1.1, HTTP/2, 以及 WebSockets.
安裝和運(yùn)行的命令如下:
pip install hypercorn hypercorn app:App
說了 ASGI 服務(wù)器,接下來就是支持 ASGI 的框架了
ASGI 框架
您可以使用 Uvicorn,Daphne 或 Hypercorn 運(yùn)行任何 ASGI 框架
對(duì)于小型服務(wù),您也可以直接編寫 ASGI 應(yīng)用程序。例如之前編寫的異步框架。
Python 中有以下幾個(gè)支持 ASGI 的異步框架
Starlette
Starlette 是一個(gè)輕量級(jí)的 ASGI 框架/工具包。它是構(gòu)建高性能異步服務(wù)的理想選擇,并且支持 HTTP 和 WebSockets。
Django Channels
ASGI 規(guī)范最初是設(shè)計(jì)就是用于 Django Channels 的。
Channels 與其他ASGI框架略有不同,它在線程框架后端上提供了異步前端。
同時(shí) Django Channels 支持 WebSocket,后臺(tái)任務(wù)和長期運(yùn)行的連接,而應(yīng)用程序代碼仍在標(biāo)準(zhǔn)線程上下文中運(yùn)行
Quart
Quart 是一個(gè)類似于 Flask 的 ASGI Web 框架。Quart 不僅與 Flask 相似,而且與 Flask API 兼容!
因此,你可以從 Flask 文檔中學(xué)習(xí) Quart 的用法,只需要記住 Quart 中的函數(shù)是異步的就行。
一個(gè)簡單的 Quart 服務(wù):
from quart import Quart app = Quart(__name__) @app.route('/') async def hello(): return 'hello'app.run()
和 Flask 是不是很像,只是多了一個(gè)異步 async
由于 Quart 是從 Flask 中演進(jìn)過來的,因此 Flask 的所有功能均可用:路由,中間件,會(huì)話,模板,藍(lán)圖等
FastAPI
FastAPI 是一個(gè)基于 Starlette 和 Pydantic 的 API 框架,其靈感來自以前的 APISta 服務(wù)器版本
您可以使用 Python 3.6+ 類型聲明編寫 API 函數(shù)參數(shù),并獲得自動(dòng)數(shù)據(jù)轉(zhuǎn)換,數(shù)據(jù)驗(yàn)證。
FastApi 最主要的特點(diǎn)是快,非常高的性能,向 NodeJS 和 Go 看齊,現(xiàn)有最快的Python框架之一
同時(shí)它可以自動(dòng)生成交互式 API 文檔 UI,編寫 API 接口后,你就可以使用符合標(biāo)準(zhǔn)的 UI 如 SwaggerUI,ReDoc 等來使用 API。
API HTTP Python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。