Python 異步 ASGI 服務(wù)器及框架

ASGI

在 Python3.5 之后增加 async/await 特性之后,異步編程變得異常火爆,越來越多開發(fā)者投入異步的懷抱。

直到最近,Python 仍缺乏用于 asyncio 框架的最低限度的低級服務(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ù)啟動之后,我們通過瀏覽器就能方位該服務(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 框架

對于小型服務(wù),您也可以直接編寫 ASGI 應(yīng)用程序。例如之前編寫的異步框架。

Python 中有以下幾個(gè)支持 ASGI 的異步框架

Starlette

Starlette 是一個(gè)輕量級的 ASGI 框架/工具包。它是構(gòu)建高性能異步服務(wù)的理想選擇,并且支持 HTTP 和 WebSockets。

Django Channels

ASGI 規(guī)范最初是設(shè)計(jì)就是用于 Django Channels 的。

Channels 與其他ASGI框架略有不同,它在線程框架后端上提供了異步前端。

同時(shí) Django Channels 支持 WebSocket,后臺任務(wù)和長期運(yùn)行的連接,而應(yīng)用程序代碼仍在標(biāo)準(zhǔn)線程上下文中運(yùn)行

Quart

Quart 是一個(gè)類似于 Flask 的 ASGI Web 框架。Quart 不僅與 Flask 相似,而且與 Flask API 兼容!

該框架的作者希望保留了Flask 的風(fēng)格,只是向其中添加異步、WebSocket 和 HTTP 2支持。

因此,你可以從 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 的所有功能均可用:路由,中間件,會話,模板,藍(lán)圖等

FastAPI

FastAPI 是一個(gè)基于 Starlette 和 Pydantic 的 API 框架,其靈感來自以前的 APISta 服務(wù)器版本

您可以使用 Python 3.6+ 類型聲明編寫 API 函數(shù)參數(shù),并獲得自動數(shù)據(jù)轉(zhuǎn)換,數(shù)據(jù)驗(yàn)證。

FastApi 最主要的特點(diǎn)是快,非常高的性能,向 NodeJS 和 Go 看齊,現(xiàn)有最快的Python框架之一

同時(shí)它可以自動生成交互式 API 文檔 UI,編寫 API 接口后,你就可以使用符合標(biāo)準(zhǔn)的 UI 如 SwaggerUI,ReDoc 等來使用 API。

swagger-ui
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容