天下武功渗稍,唯快不破佩迟。在軟件開發(fā)中更是如此,“快”能從多方面提升用戶體驗竿屹。談到Python报强,它似乎天生就和速度無關(guān),你可能很熟悉Django拱燃、Flask這些框架秉溉,雖然開發(fā)效率的確不錯,但是速度就一言難盡碗誉。那么在前后端分離開發(fā)的時代坚嗜,有沒有能拿得出手的Python Web框架呢?當(dāng)然是有的诗充,F(xiàn)astApi它來了。
一诱建、為什么是FastApi蝴蜓?
人們在介紹FastApi的時候通常會說“FastApi”是一個高性能的異步WEB框架。我相信沒有哪個程序員會跟“高性能”過不去俺猿,這往往也是我們所追求的東西茎匠。fastapi具有并發(fā)性能強、能夠快速上手押袍、容錯能力強诵冒、自動生成交互式文檔的特點,這些都是我們選擇它的理由谊惭。
二汽馋、到底有多快?
很多人介紹FastApi框架時圈盔,經(jīng)常說其并發(fā)性能能夠和NodeJS以及Go媲美豹芯,其實言過其實。在Go語言中文社區(qū)中夢想做小猿分別對Go驱敲、Flask铁蹈、FastApi做了性能測試,迫于篇幅限制众眨,我這里直接放結(jié)果:
FastAPI:500并發(fā) 30秒:Speed=955466 pages/min, 238685 bytes/sec
Flask:500并發(fā) 30秒:Speed=33706 pages/min, 96457 bytes/sec
Go:500并發(fā) 30秒:Speed=116962 pages/min, 278740 bytes/sec
可見Go還是很強大的握牧,但是fastapi已經(jīng)遠(yuǎn)遠(yuǎn)超過了同為python框架的 flask容诬。
與PHP7對比:
分別用PHP7、FastAPI從mongodb數(shù)據(jù)庫中取出相同的數(shù)據(jù)做成接口沿腰,相同參數(shù)得到相同的數(shù)據(jù)結(jié)果览徒,速度如下:
FastApi用時43.06ms:
PHP7 用時43.73ms:
經(jīng)過多次測試,成績較為穩(wěn)定矫俺,無需取平均值吱殉,由此看來,F(xiàn)astApi速度上相比于其他Python框架厘托,是占有絕對優(yōu)勢的友雳!
三、安裝相關(guān)模塊
FaseApi這么快铅匹,想必你已經(jīng)迫不及待想要了解如何使用了押赊。接下來我們講講如何開始第一個FastApi項目。
安裝FastApi執(zhí)行 pip install fastapi
由于FastApi還需要一個ASGI服務(wù)框架 uvicorn包斑,需要執(zhí)行pip install uvicorn來安裝uvicorn流礁。
注意Linux下一般會報錯如下:
Centos 執(zhí)行yum install python3-devel,Ubuntu 執(zhí)行sudo apt-get install python3-dev罗丰,即可解決問題神帅,非常簡單!
四萌抵、Hello找御, API
現(xiàn)在就來快速上手吧:
第一個api:
創(chuàng)建文件zhiliao.py,碼代碼:
然后在zhiliao.py文件所在目錄绍填,執(zhí)行uvicorn zhiliao:app --reload
其中霎桅,zhiliao是py文件名,冒號后面的app是我們在代碼中創(chuàng)建的FastAPI實例讨永,這一點類似Flask滔驶,其他參數(shù)等下會詳細(xì)說到。
執(zhí)行之后卿闹,得到反饋信息揭糕。
可以看到Uvicorn running on [http://127.0.0.1:8000 [0m (Press CTRL+C to quit),打開瀏覽器:
這樣就成功的創(chuàng)建了第一個接口服務(wù)锻霎,每次請求的同時我們也能能夠看到插佛,請求日志,方便調(diào)試量窘。
獲取路徑參數(shù):
接著寫如下代碼:
保存之后可以看到:
項目自動重新加載了雇寇,我們無需再執(zhí)行uvicorn……,原因是我們剛剛啟動實例時,加了--reload參數(shù)锨侯,這一點類似于Flask中的debug=True嫩海,不推薦在線上環(huán)境中開啟,僅為了線下調(diào)試方便囚痴。
訪問瀏覽器:http://127.0.0.1:8000/hello/知了叁怪,可以看到:
我們不難發(fā)現(xiàn),res在程序中是一個字典深滚,而fastapi將其自動轉(zhuǎn)為了json格式奕谭,無需再使用json模塊進行編碼,這極大的便利了我們的開發(fā)痴荐。
問號傳參與數(shù)據(jù)類型限制:
為了防止用戶填寫表單時不按套路來血柳,我們最好對參數(shù)類型進行限制,上代碼:
瀏覽器訪問http://127.0.0.1:8000/zhiliao?name=張三&age=23:
如果改成http://127.0.0.1:8000/zhiliao?name=張三&age='23'也即是字符23,會報錯生兆,提示數(shù)據(jù)類型錯誤难捌。
{"detail":[{"loc":["query","age"],"msg":"value is not a valid integer","type":"type_error.integer"}]}
自動生成文檔:
fastapi具有自動生成文檔的能力:
交互文檔:
訪問:http://127.0.0.1:8000/docs,可以看到鸦难,上面我們寫的三個接口都已經(jīng)給出了文檔根吁。
還可以繼續(xù)用于測試,我們測試一下第三個接口合蔽,填寫兩個值击敌,然后點擊 execute:
可以看到,給出了非常詳細(xì)的反饋信息:
API文檔:
我們打開http://127.0.0.1:8000/redoc
可以看到詳細(xì)的文檔:
五拴事、進階篇:
1. 基礎(chǔ)參數(shù)配置:
我們使用uvicorn 配合fastapi沃斤,它是一個基于 asyncio 開發(fā)的一個輕量級高效的 Web 服務(wù)器框架。
下面一條命令演示常用參數(shù):
--host是綁定的地址挤聘,127.0.0.1為本地,如果是0.0.0.0,那么意味著它將暴露在公網(wǎng)中捅彻,所有人都可以訪問组去,線上環(huán)境常用。
--port 80表示步淹,使用80端口作為該服務(wù)的默認(rèn)端口从隆,無需在地址后加端口號,可以直接訪問 http://127.0.0.1
2. 開啟 HTTPS缭裆, 給你的網(wǎng)站加把小鎖:
鮮有人在講fastapi時提到開啟HTTPS键闺,大人,時代變了澈驼,http早已經(jīng)被谷歌瀏覽器標(biāo)記為不安全辛燥。不過,你還別說,網(wǎng)站上了https 還真是好看呢挎塌。
另外徘六,如果我們的應(yīng)用不開啟https,那么將意味著只能被未開啟ssl的網(wǎng)站調(diào)用榴都,假設(shè)我們主站用的是https待锈,那么我們必須開啟HTTPS,否則會調(diào)用失敗嘴高。
說了這么多竿音,其實做起來很簡單,執(zhí)行uvicorn --help可以看到詳細(xì)的配置文檔拴驮,可以看到:
有這么三個參數(shù)春瞬,第一個是證書的key文件,第二個是crt文件莹汤,第三個不用管是默認(rèn)的快鱼。
只需執(zhí)行:
uvicorn zhiliao:app --host 0.0.0.0 --port 8080 --ssl-keyfile /ssl/private.key --ssl-certfile /ssl/certificate.crt
這意味著我們的應(yīng)用將會在8080端口運行,并且暴露在公網(wǎng)中纲岭,人們都可以訪問抹竹,--ssl-keyfile參數(shù)后面跟key文件目錄,--ssl-certfile止潮,同理窃判。可以看到喇闸,網(wǎng)站已經(jīng)可以用https訪問袄琳。
3. 配置跨域傳參
既然是接口服務(wù),那么跨域傳參是必然要碰到的問題燃乍。
現(xiàn)有情景如下我們的Api服務(wù)是127.0.0.0:8000唆樊,而我們的網(wǎng)站主域名是127.0.0.1,
不同端口屬于不同域刻蟹,下面的介紹也適合其他跨域場景比如主站是www.xx.com而api服務(wù)的域名是api.xx.com逗旁,同樣適合。
現(xiàn)在網(wǎng)站要調(diào)用api的接口舆瘪,我們用jquery的 ajax試一下:
建立一個測試文件zhiliao.html,寫入如下內(nèi)容并訪問:
可以看到片效,由于是不同域,訪問失斢⒐拧:
加上幾行代碼淀衣,最終如下:
我們刷新瀏覽器:
跨域傳參成功,獲取數(shù)據(jù)成功召调。
那么膨桥,介紹到這里就結(jié)束了蛮浑,相信有了python+fastapi的加持,python在web領(lǐng)域又多了一席之地国撵。也希望陵吸,fastapi成為你的得力工具。
更多干貨內(nèi)容介牙,歡迎關(guān)注公眾號:知了python