全面擁抱FasiApi ——三大參數及驗證
前幾天寫了一篇關于 FastApi 進階的多應用程序管理藍圖APIRouter
先看下 FastAPI 有哪些突出特點,官網介紹如下:
快速:非常高的性能,性能可與NodeJS和Go相媲美(感謝Starlette 和 Pydantic)。現有最快的Python框架之一。
快速編碼:將功能開發速度提高約200%至300%*。
更少的錯誤:減少約40%的人為錯誤(開發人員)。
直觀:強大的編輯器支持,程序調試時間更少。
簡易:易于使用和學習,減少閱讀文檔的時間。
短:最小化重復代碼,每個參數聲明中的多個功能,減少編碼錯誤。
健壯:獲取可用于生產的代碼。具有自動交互式的 API 文檔。
基于標準:基于(并完全兼容)API 的開放標準:OpenAPI(以前稱為Swagger)和JSON Schema。
前面說過 FastApi 的一大特點是基于標準的 Python 3.6類型聲明,兼具參數校驗功能,這一切都要歸功于 Pydantic
路徑參數
路徑參數即 url 路徑參數,可以使用 Python 格式字符串相同語法聲明路徑“參數”或“變量”,例如:
from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") async def read_item(item_id: int, q: str = None): return {"item": item_id, "q": q}
path 參數的值 item_id 將作為參數傳遞給視圖函數,運行命令:
uvicorn 文件名:app
默認端口是 8000,也可以指定 host 和 port , --host=0.0.0.0 --port=8008
運行之后,在瀏覽器種打開 http://127.0.0.1:8000/items/1,可以看到響應:
{"item":1,"q":null}
其中 item_id 被聲明為 int 類型,q 為 可選參數,默認為None,所以響應中的 q 是 None
當我們通過 http://127.0.0.1:8000/items/test 去訪問的時候, 可以看到一個非常友好的錯誤響應
{ "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] }
因為 path 參數 item_id 的值是 “test” 不能轉為 int,這就是參加驗證
查詢參數
查詢參數也是帶在 url 地址中的,是 url 中位于 ?之后的一組鍵值對,以 & 字符分隔,這對爬蟲朋友來說再熟悉不過了,比如下面的請求參數
data = {"test": 1, "name": "Python編程與實戰"} response = requests.get(url, params=data)
以 關鍵字參數 params 傳過去的就是查詢參數,你可以將其中的 response.url 打印出來即可看到 ?之后的鍵值對參數
那么在服務端 FastApi 如何來接收這種參數呢? 請看代碼
from fastapi import FastAPI app = FastAPI() fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}] @app.get("/items/") async def read_item(skip: int = 0, limit: int = 10): return fake_items_db[skip : skip + limit]
運行后輸入地址:http://127.0.0.1:8000/items/?skip=0&limit=10
查詢參數為:
skip:值為 0
limit:值為 10
注意這兩個參數都帶有默認值,可以選擇只傳一個
可選參數
同樣,您可以通過將可選查詢參數的默認值設置為來聲明可選查詢參數 None
from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") async def read_item(item_id: str, q: str = None): if q: return {"item_id": item_id, "q": q} return {"item_id": item_id}
必需查詢參數
將上面代碼中的 q: str 去掉 None,則 q 變成了必須查詢參數,也就是必傳的,否則會提示錯誤
{ "detail": [ { "loc": [ "query", "q" ], "msg": "field required", "type": "value_error.missing" } ] }
給大伙總結一下,在實際代碼中可能會用到必需參數,默認參數,可選參數,如下:
from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") async def read_user_item(item_id: str, needy: str, skip: int = 0, limit: int = None): item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit} return item
在這種情況下,有3個查詢參數:
needy,是必需的 str 。
skip,int 默認值為 0。
limit,可選的 int。
其中還有一個是路徑參數:item_id, str 類型
請求體參數
要發送請求正文,必須使用一個:POST, PUT,DELETE或PATCH,需導入 Pydantic 的 BaseModel
from fastapi import FastAPI import uvicorn from pydantic import BaseModel app = FastAPI() class CommonItem(BaseModel): token: str message_id: str to_id: str from_info: str strategy: int or str = 0 # 默認為0,可不傳該參數,但是不能傳空字符串 type: str or int # str 和 int 類型都支持 from_id: str to_info: str content: str = None @app.post("/test") async def tests(item: CommonItem): return item
可以看到,創建了一個 CommonItem 模型,有了聲明的這個模型,可以實現以下功能:
以 JSON 讀取請求的正文
根據聲明的類型,自動對參數進行轉換
驗證數據,如果數據無效,它將返回一個清晰的錯誤,指出錯誤數據的確切位置和來源
在參數中接收收到的數據 item,并能獲取所有屬性及所有編輯器的支持
同時,FastApi 可以自動幫我們識別請求 body 參數, 路徑參數以及查詢參數,并準確的獲取參數數據。例如以下代碼:
from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name: str description: str = None price: float tax: float = None app = FastAPI() @app.put("/items/{item_id}") async def create_item(item_id: int, item: Item, q: str = None): result = {"item_id": item_id, **item.dict()} if q: result.update({"q": q}) return result
上述代碼,參數將被自動識別:
item_id,: 路徑參數
q: 參數是一個的單一類型(如int,float,str,bool,等等)將被解釋為一個查詢參數
item: 參數聲明為 Pydantic 模型的類型,則將被解釋為請求 body
HTML Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。