性能是Flask的3倍!比PHP7還快!這個Python框架你值得擁有! - 知乎

天下武功,惟快不破。在軟件開發中更是如此,「快」能從多方面提高用戶體驗。談到Python,它彷佛天生就和速度無關,你可能很熟悉Django、Flask這些框架,雖然開發效率的確不錯,可是速度就一言難盡。那麼在先後端分離開發的時代,有沒有能拿得出手的Python Web框架呢?固然是有的,FastApi它來了。html

1、爲何是FastApi?

人們在介紹FastApi的時候一般會說「FastApi」是一個高性能的異步WEB框架。我相信沒有哪一個程序員會跟「高性能」過不去,這每每也是咱們所追求的東西。fastapi具備併發性能強、可以快速上手、容錯能力強、自動生成交互式文檔的特色,這些都是咱們選擇它的理由。python



2、到底有多快?

不少人介紹FastApi框架時,常常說其併發性能可以和NodeJS以及Go媲美,其實言過其實。在Go語言中文社區中夢想作小猿分別對Go、Flask、FastApi作了性能測試,迫於篇幅限制,我這裏直接放結果:jquery

FastAPI:500併發 30秒:Speed=955466 pages/min, 238685 bytes/sec程序員

Flask:500併發 30秒:Speed=33706 pages/min, 96457 bytes/secweb

Go:500併發 30秒:Speed=116962 pages/min, 278740 bytes/secajax

可見Go仍是很強大的,可是fastapi已經遠遠超過了同爲python框架的 flask。mongodb

與PHP7對比:數據庫

分別用PHP七、FastAPI從mongodb數據庫中取出相同的數據作成接口,相同參數獲得相同的數據結果,速度以下:json

FastApi用時43.06ms:flask



PHP7 用時43.73ms:



通過屢次測試,成績較爲穩定,無需取平均值,由此看來,FastApi速度上相比於其餘Python框架,是佔有絕對優點的!

3、安裝相關模塊

FaseApi這麼快,想必你已經火燒眉毛想要了解如何使用了。接下來咱們講講如何開始第一個FastApi項目。

安裝FastApi執行 pip install fastapi

因爲FastApi還須要一個ASGI服務框架 uvicorn,須要執行pip install uvicorn來安裝uvicorn。

注意Linux下通常會報錯以下:



Centos 執行yum install python3-devel,Ubuntu 執行sudo apt-get install python3-dev,便可解決問題,很是簡單!

4、Hello, API

如今就來快速上手吧:

第一個api:

建立文件zhiliao.py,碼代碼:



而後在zhiliao.py文件所在目錄,執行uvicorn zhiliao:app --reload

其中,zhiliao是py文件名,冒號後面的app是咱們在代碼中建立的FastAPI實例,這一點相似Flask,其餘參數等下會詳細說到。

執行以後,獲得反饋信息。



能夠看到Uvicorn running on [http://127.0.0.1:8000 [0m (Press CTRL+C to quit),打開瀏覽器:



這樣就成功的建立了第一個接口服務,每次請求的同時咱們也能可以看到,請求日誌,方便調試。



獲取路徑參數:

接着寫以下代碼:



保存以後能夠看到:



項目自動從新加載了,咱們無需再執行uvicorn……,緣由是咱們剛剛啓動實例時,加了--reload參數,這一點相似於Flask中的debug=True,不推薦在線上環境中開啓,僅爲了線下調試方便。

訪問瀏覽器:http://127.0.0.1:8000/hello/知了,能夠看到:



咱們不難發現,res在程序中是一個字典,而fastapi將其自動轉爲了json格式,無需再使用json模塊進行編碼,這極大的便利了咱們的開發。

問號傳參與數據類型限制:

爲了防止用戶填寫表單時不按套路來,咱們最好對參數類型進行限制,上代碼:



瀏覽器訪問http://127.0.0.1:8000/zhiliao?name=張三&age=23:



若是改爲http://127.0.0.1:8000/zhiliao?name=張三&age='23'也便是字符23,會報錯,提示數據類型錯誤。

{"detail":[{"loc":["query","age"],"msg":"value is not a valid integer","type":"type_error.integer"}]}

自動生成文檔:

fastapi具備自動生成文檔的能力:

交互文檔:

訪問:http://127.0.0.1:8000/docs,能夠看到,上面咱們寫的三個接口都已經給出了文檔。



還能夠繼續用於測試,咱們測試一下第三個接口,填寫兩個值,而後點擊 execute:



能夠看到,給出了很是詳細的反饋信息:



API文檔:

咱們打開http://127.0.0.1:8000/redoc

能夠看到詳細的文檔:


5、進階篇:

1. 基礎參數配置:

咱們使用uvicorn 配合fastapi,它是一個基於 asyncio 開發的一個輕量級高效的 Web 服務器框架。

下面一條命令演示經常使用參數:



--host是綁定的地址,127.0.0.1爲本地,若是是0.0.0.0,那麼意味着它將暴露在公網中,全部人均可以訪問,線上環境經常使用。

--port 80表示,使用80端口做爲該服務的默認端口,無需在地址後加端口號,能夠直接訪問 http://127.0.0.1

2. 開啓 HTTPS, 給你的網站加把小鎖:

鮮有人在講fastapi時提到開啓HTTPS,大人,時代變了,http早已經被谷歌瀏覽器標記爲不安全。不過,你還別說,網站上了https 還真是好看呢。

另外,若是咱們的應用不開啓https,那麼將意味着只能被未開啓ssl的網站調用,假設咱們主站用的是https,那麼咱們必須開啓HTTPS,不然會調用失敗。

說了這麼多,其實作起來很簡單,執行uvicorn --help能夠看到詳細的配置文檔,能夠看到:



有這麼三個參數,第一個是證書的key文件,第二個是crt文件,第三個不用管是默認的。

只需執行:

uvicorn zhiliao:app --host 0.0.0.0 --port 8080 --ssl-keyfile /ssl/private.key --ssl-certfile /ssl/certificate.crt

這意味着咱們的應用將會在8080端口運行,而且暴露在公網中,人們均可以訪問,--ssl-keyfile參數後面跟key文件目錄,--ssl-certfile,同理。能夠看到,網站已經能夠用https訪問。



3. 配置跨域傳參

既然是接口服務,那麼跨域傳參是必然要碰到的問題。

現有情景以下咱們的Api服務是127.0.0.0:8000,而咱們的網站主域名是127.0.0.1,

不一樣端口屬於不一樣域,下面的介紹也適合其餘跨域場景好比主站是http://www.xx.com而api服務的域名是http://api.xx.com,一樣適合。

如今網站要調用api的接口,咱們用jquery的 ajax試一下:

創建一個測試文件zhiliao.html,寫入以下內容並訪問:



能夠看到,因爲是不一樣域,訪問失敗:



加上幾行代碼,最終以下:



咱們刷新瀏覽器:



跨域傳參成功,獲取數據成功。

那麼,介紹到這裏就結束了,相信有了python+fastapi的加持,python在web領域又多了一席之地。也但願,fastapi成爲你的得力工具。

原文連接:https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9316056851113532144%22%7D&n_type=1&p_from=4

相關文章
相關標籤/搜索