終于,F(xiàn)lask 迎來(lái)了真正的對(duì)手!

Flask 是一個(gè)輕量級(jí)的可定制框架,使用 Python 語(yǔ)言編寫(xiě),框架特點(diǎn)主要包括靈活、輕便、安全且容易上手。小型團(tuán)隊(duì)在短時(shí)間內(nèi)就可以完成功能豐富的 Web 接口服務(wù)的實(shí)現(xiàn)。
今天它的對(duì)手 FastApi 框架來(lái)啦!FastAPI是一種現(xiàn)代,高性能的Web框架:
支持異步編碼;
框架源碼全部基于標(biāo)準(zhǔn)的 Python 3.6 類型聲明;
100%類型注釋的代碼庫(kù);
框架也有靈活、輕便、安全的特點(diǎn);
一.FastApi 如何安裝
和 Flask 的安裝方式一樣,都是可以使用 pip 安裝。直接在終端執(zhí)行命令 pip install "fastapi[all]", 即可安裝 FastApi 和它所需要的一些依賴。

二.Flask VS FastApi
01.代碼風(fēng)格對(duì)比
1).使用 Flask 開(kāi)發(fā)一個(gè)簡(jiǎn)單的需求:
有這樣的需求:編寫(xiě)一個(gè)API 接口,接收 POST 請(qǐng)求發(fā)送過(guò)來(lái)的數(shù)據(jù),對(duì)參數(shù)進(jìn)行處理,并返回,使用 Flask 開(kāi)發(fā)接口的代碼如下:

看起來(lái)似乎很簡(jiǎn)潔了,用 postman 發(fā)個(gè)請(qǐng)求看看效果,如圖所示:

2).使用 FastApi 開(kāi)發(fā)上述需求

代碼風(fēng)格和 Flask 很相似,都是把框架類實(shí)例化成了一個(gè) app 對(duì)象,這個(gè) app 作為一個(gè)裝飾器使用。
02.接口健壯性對(duì)比
1).使用 postman 請(qǐng)求 Flask 編寫(xiě)的接口
請(qǐng)求 Flask 編寫(xiě)的接口時(shí),請(qǐng)求參數(shù) num 的值忘記傳了,代碼就會(huì)報(bào)錯(cuò),例如:

為了保證接口的健壯性,必須為接口加上一些參數(shù)校驗(yàn)的代碼,增加參數(shù)校驗(yàn)后代碼變得復(fù)雜了。
雖然 Flask 可以讓你用很少的代碼寫(xiě)出一個(gè)可以正常運(yùn)行的項(xiàng)目,但是寫(xiě)成一個(gè)可以正常使用的項(xiàng)目還需要你寫(xiě)更多的代碼。

2).使用 postman 請(qǐng)求 FastApi 編寫(xiě)的接口
去掉請(qǐng)求參數(shù) num ,效果是這樣的,我們來(lái)看一下

FastApi 編寫(xiě)接口會(huì)智能的返回錯(cuò)誤信息,提示 num 字段缺失,未傳參,保證了接口的健壯性。參數(shù)校驗(yàn)由 FastApi 框架自己完成,不用我們?cè)賹?xiě)額外的代碼進(jìn)行參數(shù)校驗(yàn)。
三.框架性能對(duì)比
網(wǎng)站性能對(duì)于普通用戶來(lái)說(shuō),最直接的體現(xiàn)就是響應(yīng)時(shí)間。從開(kāi)發(fā)人員的角度看,網(wǎng)站性能的指標(biāo)主要有并發(fā)數(shù)和響應(yīng)時(shí)間。
FastApi 框架正如其名字一樣,它是可用的最快的 Python web 框架之一。

上圖的性能對(duì)比基準(zhǔn)是基于每秒響應(yīng)數(shù),每個(gè)請(qǐng)求20個(gè)查詢,明顯看出 FastApi 接口響應(yīng)速度比 Flask 快很多。
1).Flask 部署方式
由于 Flask 本身是不支持異步編碼,所以它一般的部署方式和同步的框架 Django 是一樣的,都是用 uwsgi 部署。
2).FastApi部署方式
FastAPI 是個(gè)異步框架,所以它是支持 async/await 異步編程語(yǔ)法的,比如下面這段代碼:

本地和生產(chǎn)環(huán)境中,F(xiàn)astApi 都是通過(guò) uvicorn 運(yùn)行的,運(yùn)行指令都是 ?uvicorn main:app —reload ,其中main 是腳本名稱。uvicorn 一個(gè)性能非常高 的 ASGI 服務(wù)器,基于 uvloop 和 httptools 構(gòu)建。
四.API接口文檔對(duì)比
在項(xiàng)目開(kāi)發(fā)中,Web 項(xiàng)目的前后端分離開(kāi)發(fā)需要由前后端工程師共同定義接口。編寫(xiě)接口文檔,之后大家都根據(jù)這個(gè)接口文檔進(jìn)行開(kāi)發(fā),同時(shí)也方便后期人員查看、維護(hù)。
Flask 框架本身并沒(méi)有自帶 API 文檔,需要借助第三方插件實(shí)現(xiàn),生成API接口文檔的第三方插件還是蠻多,但是對(duì)選擇困難癥的朋友不是很友好。而 FastApi 框架本身自帶生成交互式的 API 接口文檔,對(duì)于選擇困難癥的朋友是很友好的,直接使用框架自帶的Api交互式文檔即可。
對(duì)于 FastApi 框架,訪問(wèn)http://127.0.0.1:8000/docs, 看到的是 swagger-ui類型的文檔:

如果訪問(wèn) http://127.0.0.1:8000/redoc , 看到的是redoc風(fēng)格的接口文檔:

5.框架現(xiàn)代化對(duì)比
眾所周知,Python 的變量隨時(shí)可以被賦值,且能賦值為不同的類型,由于不做任何類型檢查,有些問(wèn)題直到運(yùn)行才顯現(xiàn)出來(lái),或者線上運(yùn)行時(shí)才能暴露出問(wèn)題。
而類型注釋可以對(duì)函數(shù)的參數(shù)進(jìn)行類型注解,也可以對(duì)函數(shù)的返回值進(jìn)行類型注解。使用類型注釋保證了更少的錯(cuò)誤。
細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),小編在 FastApi 代碼中寫(xiě)了一些基于標(biāo)準(zhǔn)的 Python 3.6+ 的類型注釋聲明,對(duì)一些請(qǐng)求參數(shù)的類型做了限定,比如:

1).Flask 框架的源碼:
Flask 框架源碼并沒(méi)有使用現(xiàn)代化的類型注釋聲明。

2).FastApi 框架的源碼:
FastApi 框架源碼有 100% 類型注釋的代碼庫(kù),并且全部基于標(biāo)準(zhǔn)的Python 3.6+ 的類型聲明。小編找了 FastApi 一段源碼,每個(gè)請(qǐng)求參數(shù)和返回參數(shù)都做了類型注釋的聲明:

有興趣的小伙伴,下次在做后端項(xiàng)目的時(shí)候,可以試試FastAPI,也許效果會(huì)讓你大吃一驚哦!希望本篇的分享對(duì)大家有幫助,歡迎大家三連!
由于微信平臺(tái)算法改版,公號(hào)內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:
(1)點(diǎn)擊頁(yè)面最上方“小詹學(xué)Python”,進(jìn)入公眾號(hào)主頁(yè)。
(2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁(yè)面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。
感謝支持,比心。

