Web框架在最近幾年也發(fā)生了很大的變化,,從大而全,轉(zhuǎn)向現(xiàn)在專注于后端接口服務(wù),。例如PHP的codeigniter(我只用過這一點),,比如Python的django框架,,都是基于MVC的Web框架,一個框架就可以完全解決前后端的問題,。在基于javascript語言的前端大放異彩之后,,后端Web框架已經(jīng)讓出了V(視圖),把注意力集中在做MC的工作上,,當(dāng)然前端可以干MC的工作,,但先從后端開發(fā)同學(xué)的工作上來。 Python語言下面的Web框架非常的多,。 從大而全的Django,。 小而且美的Flask。 很早就支持異步的Tornado,。 性能更進一步的異步框架sanic,。 以上幾款Web框架我多少都有使用過,我一度覺得sanic是pythonWeb框架的未來,,支持異步,,性能好,類flask的語法,,代碼簡單,,沒想到被fastapi截胡了,fastapi在github的上星速度非???。它在如何把后端api做好的這件事情上,,做的比sanic更全面,更徹底,。 個覺得fastapi在以下幾個方面做得很優(yōu)秀,。 性能先做個簡單的性能對比: flask # flask==2.0.1from flask import Flaskfrom flask import jsonify app = Flask(__name__) @app.route("/") def hello_world(): return jsonify({"hello": "world"})1234567891011復(fù)制代碼類型:[javascript] fastapi # fastapi==0.65.1from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"}12345678910復(fù)制代碼類型:[javascript] 雖然兩個框架都支持異步(flask2.0支持異步),但我們使用的都是同步代碼,。 JMeter配置:并發(fā)(500)*循環(huán)(100)*啟動時間(1s)=總請求數(shù)(50000)
雖然是簡單的對比,,fastapi在各項性能指標(biāo),都有非常明顯的性能優(yōu)勢,。 api文檔fastapi直接支持OpenAPI(前身是Swagger)和redoc兩種文檔格式,。 # main.pyfrom typing import Optionalfrom fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q}1234567891011121314151617復(fù)制代碼類型:[javascript] 啟動服務(wù): > uvicorn main:app --reloadINFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)INFO: Started reloader process [19224] using statreloadINFO: Started server process [23320]INFO: Waiting for application startup.INFO: Application startup complete.123456復(fù)制代碼類型:[javascript] 訪問:http://127.0.0.1:8000/docs 訪問:http://127.0.0.1:8000/redoc 對于開發(fā)來說,簡直不要太爽了,,代碼即文檔,,壓根不用寫接口文檔。試問:還是誰,? 類型檢查我們知道python是弱類型的語言,,直到python3.5才加入類型系統(tǒng)。而我們在做接口參數(shù)校驗的時候,,必定要寫大量代碼驗證參數(shù)是否為空,,類型是否正確,。 flask import jsonfrom flask import Flaskfrom flask import jsonifyfrom flask import request app = Flask(__name__) @app.route('/items/<int:item_id>', methods=['GET', 'POST', "PUT", "DELETE"]) def update_item(item_id): if request.method == "PUT": try: data = json.loads(request.get_data()) except json.decoder.JSONDecodeError: return jsonify({"code":10101, "msg": "format error"}) try: name = data["name"] price = data["price"] is_offer = data["is_offer"] except KeyError: return jsonify({"code": 10102, "msg": "key null"}) if not isinstance(name, str): return jsonify({"code": 10103, "msg": "name not is str"}) if not isinstance(price, float): return jsonify({"code": 10104, "msg": "price not is float"}) if not isinstance(is_offer, bool): return jsonify({"code": 10105, "msg": "is_offer not is bool"}) return jsonify({"item_name": name, "item_id": item_id})1234567891011121314151617181920212223242526272829303132復(fù)制代碼類型:[javascript] 在flask中為了驗證參數(shù)是否為空,,以及參數(shù)的類型,必須要寫大量的異常和類型判斷的代碼,。 fastapi from typing import Optionalfrom fastapi import FastAPIfrom pydantic import BaseModel app = FastAPI()class Item(BaseModel): name: str price: float is_offer: Optional[bool] = None @app.put("/items/{item_id}") def update_item(item_id: int, item: Item): return {"item_name": item.name, "item_id": item_id}1234567891011121314151617復(fù)制代碼類型:[javascript] fastapi通過pydantic檢查參數(shù)類型,,有一點像go的結(jié)構(gòu)體,簡直不要太簡單,。 總結(jié)fastapi憑借上面幾個優(yōu)點,,真的非常適合做后端API開發(fā)的工作,不管是從性能,,還是開發(fā)效率上面優(yōu)勢非常明顯,,受到大家的追捧也是必然的。 |
|
來自: 碼農(nóng)9527 > 《WEB》