1. 程式人生 > 實用技巧 >如何選擇非同步Web Python框架

如何選擇非同步Web Python框架

Python在3.4引入了 asyncio 庫,3.6新增了關鍵字async和await,此後,非同步框架迅速發展了起來,效能上能和Node.js比肩,除非是CPU密集型任務,否則沒有理由不適用非同步框架。

如果你是Web開發者,現在非同步Web框架上有了更多選擇!

1、Tornado

Tornado 根本不是什麼新框架,它最初是由FriendFeed(後被Facebook收購)在2009年釋出。從一開始就提供有非同步程式設計的功能。

Tornado 不僅僅是Web框架,同時它內建了很多非同步模組,可用於自己構建非同步應用。這些模組包括:

  • 協同程式和其他原語(tornado.gen,tornado.locks,tornado.queues等)
  • 網路模組(tornado.ioloop,tornado.iostream等)
  • 非同步伺服器和客戶端(tornado.httpserver,tornado.httpclient,等)

通過這些模組,Tornado 構建了自己的非同步Web框架模組。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

Tornado在Python社群中擁有很多追隨者,並且經驗豐富的架構師使用它們來構建功能強大的系統。這個框架長期以來一直在解決併發問題,但是由於它不支援WSGI標準(大部分Python庫仍在同步中),因此尚未成為主流。

國內據說知乎是基於Torando構建的。

2、 Snaic

Sanic是一個誕生有3年的框架:它只支援3.6以上Python版本,支援通用的async / await語法,開箱即用,因此你無需閱讀大量文件就可以寫出你的一個HTTP 處理器。

除了async關鍵字之外,語法上和 flask 基於沒差別。

from sanic import Sanic
from sanic.response import json

app = Sanic()

@app.route("/")
async def test(request):
    return json({"hello": "world"})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

Sanic可以說是Python世界中最流行和最受歡迎的非同步框架。它具有你專案中需要的所有功能:路由,中介軟體,Cookie,版本控制,藍圖,基於類的檢視,靜態檔案,流,sockets,此外你還可以整合模板,資料庫驅動,檔案I / O,佇列等等。

3、Vibora

Vibora和Sanic非常像,致力於成為最快的Python Web伺服器。

Vibora聲稱比其它框架快幾倍,比競爭對手Sanic還快兩倍多。當然,這個基準測試要持懷疑態度。

儘管在語法和功能上,Vibora可以與Sanic媲美但我認為Sanic更加成熟,因為它已經存在了很長一段時間並且具有更大的社群。

from vibora import Vibora, JsonResponse

app = Vibora()

@app.route('/')
async def home():
    return JsonResponse({'hello': 'world'})

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8000)

4、Quart

如果您喜歡Flask,但又要支援非同步, 那麼Quart你一定會喜歡

Quart符合ASGI標準,該標準是WSGI標準的後繼產品,並提供非同步支援。Quart不僅與Flask相似,而且與Flask API相容!該框架的作者希望保留了Flask的風格,只是向其中新增非同步、WebSocket和HTTP 2支援。因此,你可以從Flask文件中學習Quart的用法,只需要記住Quart中的函式是非同步的就行。

from quart import Quart

app = Quart(__name__)

@app.route('/')
async def hello():
    return 'hello'

app.run()

幾乎完全像Flask

由於Quart是從Flask中演進過來的,因此Flask的所有功能均可用:路由,中介軟體,會話,模板,藍圖等。實際上,你甚至可以直接在Quart內部使用Flask的擴充套件外掛。不過,有一個問題是它僅支援Python 3.7+。

資源搜尋網站大全https://55wd.com 廣州品牌設計公司http://www.maiqicn.com

5、FastAPI

FastAPI似乎是非同步 Python 框架裡功能、文件最豐富的框架。

該框架的作者深入研究了其他幾個框架,從諸如Django到Sanic之類的現代框架,以及NestJS(Node.js,Typescript Web框架)。

語法甚至可以說它比我們遇到的其他框架更有趣:

rom fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}

@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

FastAPI勝過其他框架的殺手鐗列表:

  • 自動生成API文件:編寫API介面後,你就可以使用符合標準的UI如SwaggerUI,ReDoc等來使用API​​。

那效能呢?FastAPI是基於Starlette庫構建的,其效能可與Node相匹配,在某些情況下甚至可以與Go相匹配。總而言之,我真的有一種感覺,FastAPI將成為Python的頂級非同步框架。

總結

如今,Python非同步生態正在發生很多事情。出現了新的框架,舊的框架正在重寫,很多庫開始支援非同步行為。對於Web框架,Python已準備就緒,可提供出色的效能。如果很長一段時間你在考慮遷移到Node或者go,那現在不需要了。