用它 5 分鐘以後,我放棄用了四年的 Flask
閱讀本文大概需要 3 分鐘。
有一個非常簡單的需求:編寫一個 HTTP 介面,使用 POST 方式傳送一個 JSON 字串,介面裡面讀取傳送上來的引數,對其中某個引數進行處理,並返回。
如果我們使用 Flask 來開發這個介面,那麼程式碼是這樣的:
from flask import Flask, request
app = Flask(__name__)
@app.route('/insert', methods=['POST'])
def insert():
info = request.json
name = info['name']
age = info['age']
age_after_10_years = age + 10
msg = f'此人名叫:{name},10年後,此人年齡:{age_after_10_years}'
return {'success': True, 'msg': msg}
程式碼看起來已經很簡潔了。我們用requests
發個請求看看效果,如下圖所示:
看起來沒什麼問題。
現在,我搞點破壞,把age
欄位改成字串,再執行一下:
不出所料,報錯了。
現在我們把age
欄位改回數字,但是直接移除name
欄位:
又報錯了。
為了防止使用者不按規矩提交資料,我們必須在介面裡面做好各種異常資料的判斷。於是增加判斷以後的程式碼變得複雜了:
@app.route('/insert', methods=['POST'])
def insert():
info = request.json
name = info.get('name', '')
ifnot name:
return {'success': False, 'msg': 'name 引數不可省略,不可為空!'}
age = info.get('age', 0)
ifnot isinstance(age, int):
return {'success': False, 'msg': 'age引數不是數字!'}
age_after_10_years = age + 10
msg = f'此人名叫:{name},10年後,此人年齡:{age_after_10_years}'
return {'success': True, 'msg': msg}
看來,用 Flask,雖然能讓你用很短的程式碼寫出一個能工作的專案。但要寫成一個可以正常使用的專案,還是需要你自己寫更多程式碼。
下面我們來看一下,現代化的 web 框架:FastApi
能把這個工程簡化到什麼程度:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class People(BaseModel):
name: str
age: int
address: str
salary: float
@app.post('/insert')
def insert(people: People):
age_after_10_years = people.age + 10
msg = f'此人名字叫做:{people.name},十年後此人年齡:{age_after_10_years}'
return {'success': True, 'msg': msg}
我們還是使用 requests 發一條資訊給 FastApi 開發的 HTTP 介面。對於正常資料,正常使用:
現在我們把age
欄位改成字串:
返回友好的提示資訊,告訴我型別錯誤:age 欄位不是 integer
。
我們再試一試把name
欄位去掉:
返回友好資訊,提示值錯誤:name欄位丟失
。
整個過程中,對型別的檢查全都由 FastApi 自己完成。我們省下來很多時間。
我用了 Flask 四年,但在使用了 5 分鐘 FastApi 以後,我決定以後不再使用 Flask 了。
回過頭來,我們好好介紹一下 FastApi。
使用pip
或者pipenv
即可安裝 FastApi:
pip install fastapi
pipenv install fastapi
安裝完成以後,我們來完成第一個 API:
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
def index():
return {'message': '你已經正確建立 FastApi 服務!'}
這裡的寫法跟 Flask 幾乎一致。只不過在 Flask 中,我們定義路由的裝飾器為@app.route('/')
。而這裡寫為@app.get('/')
寫好程式碼以後,我們需要使用uvicorn
來執行 FastApi。首先使用pip
或者pipenv
安裝uvicorn
:
pip install uvicorn
pipenv install uvicorn
然後執行命令:
uvicorn main:app --reload
其中main
表示我們的程式碼檔案為main.py
,app
表示我們初始化的 FastApi 物件的名字。--reload
參數列示在修改了程式碼以後立即生效,不需要重啟。
執行命令以後,我們訪問http://127.0.0.1:8000
可以看到介面已經正確返回了 JSON 格式的資料:
那麼如何定義一個帶引數的 GET 方法呢?我們再寫一段程式碼:
@app.get('/query/{uid}')
def query(uid):
msg = f'你查詢的 uid 為:{uid}'
return {'success': True, 'msg': msg}
寫好程式碼以後,我們直接在瀏覽器裡面訪問新的地址,可以看到修改已經生效了,如下圖所示:
如果想限定 uid 只能是數字,不能是字串怎麼辦呢?你只需要多加 4 個字元
:
@app.get('/query/{uid}')
def query(uid: int):
msg = f'你查詢的 uid 為:{uid}'
return {'success': True, 'msg': msg}
對函式query
的引數使用型別標註,標註為 int 型別。現在我們再來訪問一下介面:
當 query 後面的引數不是整數時,正常報錯了。
我們再來看一下本文一開始的 POST 方法。在使用 Flask 的時候,我們需要手動驗證使用者 POST 提交上來的資料是什麼格式的,欄位對不對。
但使用 FastApi 的時候,我們只需要型別標註就能解決所有問題。首先我們匯入from pydantic import BaseModel
,然後繼承BaseModel
實現我們允許 POST 方法提交上來的資料欄位和格式:
from pydantic import BaseModel
app = FastAPI()
class People(BaseModel):
name: str
age: int
address: str
salary: float
People
這個類通過型別標註,指定了它裡面的 4 個欄位和他們的型別。現在,我們來實現 POST 方法:
@app.post('/insert')
def insert(people: People):
age_after_10_years = people.age + 10
msg = f'此人名字叫做:{people.name},十年後此人年齡:{age_after_10_years}'
return {'success': True, 'msg': msg}
insert
函式的引數people
通過型別標註指定為People
型別。
當我們使用 POST 方式提交資料時,FastApi 自動會以People
中定義的欄位為基準來校驗資料,發現不對就返回報錯資訊。
除了開發介面變得非常簡單外,FastApi 還會自動幫我們生成介面文件。大家訪問http://127.0.0.1:8000/docs
,可以看到介面文件已經自動生成好了:
這個介面不僅能看,而且直接就能在介面頁面修改樣例資料,傳送請求,現場測試:
以上是對 FastApi 的極簡介紹。有興趣的同學可以查閱它的官方文件。
最後,告訴大家,FastApi 是一個非同步 Web 框架,它的速度非常非常非常快。遠遠超過 Flask。
FastApi 是最快的幾個 Web 框架之一。速度可以匹敵 Golang 寫的介面。詳細的對比可以看:https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557738/viewspace-2698556/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從入門到放棄,我用了五年
- 我用了20年ERP系統,但是用它做報表,我卻後悔了
- Flask入門到放棄(四)—— 資料庫Flask資料庫
- 工作四年,捨棄廣州30K的offer,我該後悔嗎?
- 我放棄了MVP - mironovMVP
- 十分鐘學會FlaskFlask
- 為什麼JavaWeb放棄jsp,去做前後端分離JavaWebJS後端
- CPI0.15$,次留45%,遊戲時長16分鐘的專案為何放棄遊戲
- Flask一分鐘Mock一個APIFlaskMockAPI
- 5分鐘GET我使用Github 5 年總結的這些騷操作!Github
- [python][flask] Flask 入門(以一個部落格後臺為例)PythonFlask
- 讓我放棄FastDFS擁抱MinIO的8個瞬間AST
- 我為什麼在最後一刻放棄了近視眼手術
- 我為什麼放棄MySQL?選擇了MongoDBMySqlMongoDB
- Elasticsearch從入門到放棄:淺談算分Elasticsearch
- 5分鐘的ORA-04021(zt)
- 5分鐘理透LangChain的ChainLangChain
- 為尋求Windows系統效能的提升,微軟已宣佈放棄僅推出四年的ElectronWindows微軟
- React從入門到放棄(5):ReactRouter4React
- 5分鐘入門AWK
- 5分鐘學會 gRPCRPC
- Python學習從入門到放棄?我不允許!!!Python
- 5分鐘APIG實戰: 使用Rust語言快速構建API能力開放APIRust
- Elasticsearch從入門到放棄:分詞器初印象Elasticsearch分詞
- Flask前後端分離專案案例Flask後端
- MinIO很強-讓我放棄FastDFS擁抱MinIO的8個理由AST
- 5分鐘瞭解快取的概念快取
- [譯] 為什麼我放棄了 React 而轉向 Vue。ReactVue
- 第二次放棄offer,我選擇學習。
- 5分鐘快速瞭解 RedisRedis
- 5分鐘 Pipenv 上手指南
- 5分鐘掌握JavaScript小技巧JavaScript
- 5分鐘談前端面試前端面試
- 5 分鐘搞定 Java Comparable 介面Java
- 5分鐘安裝docker教程Docker
- 下班前幾分鐘,我徹底弄懂了這5種for迴圈的差異
- hive從入門到放棄(四)——分割槽與分桶Hive
- NVIDIA 或將放棄以 400 億美元收購 Arm:毫無進展