全面擁抱FasiApi ——三大參數及驗證

      網友投稿 1022 2022-05-30

      前幾天寫了一篇關于 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 去訪問的時候, 可以看到一個非常友好的錯誤響應

      全面擁抱FasiApi ——三大參數及驗證

      { "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小時內刪除侵權內容。

      上一篇:30行代碼實現螞蟻森林自動偷能量
      下一篇:物聯網與人工智能之間的區別與聯系
      相關文章
      日日摸日日碰夜夜爽亚洲| 亚洲AV成人影视在线观看| 亚洲色在线无码国产精品不卡| 亚洲第一页中文字幕| 亚洲a在线视频视频| 亚洲中文字幕无码久久2017| 亚洲中文字幕无码爆乳av中文| 国产精品亚洲精品日韩电影| 亚洲爆乳成av人在线视菜奈实| 亚洲色大成网站WWW国产| 亚洲人成网站999久久久综合| 亚洲中文字幕久久精品蜜桃| 亚洲综合久久精品无码色欲| 亚洲中文字幕久久精品蜜桃 | 亚洲youjizz| 亚洲国产av一区二区三区丶| 亚洲人成在线播放| 2017亚洲男人天堂一| 亚洲熟妇AV一区二区三区宅男| 在线观看亚洲AV日韩A∨| 亚洲精品9999久久久久无码 | 亚洲精品免费观看| 亚洲视频中文字幕| 亚洲网站在线免费观看| 亚洲国产成人久久精品app| 亚洲制服丝袜中文字幕| 亚洲国产成人久久| 亚洲综合无码一区二区痴汉| 亚洲妇女无套内射精| 亚洲AⅤ视频一区二区三区| 亚洲日韩VA无码中文字幕| 亚洲色WWW成人永久网址| 亚洲va久久久噜噜噜久久狠狠| 亚洲最大成人网色| 亚洲一区中文字幕| 处破女第一次亚洲18分钟| 久久亚洲AV永久无码精品| 国产成A人亚洲精V品无码| 亚洲综合色一区二区三区小说| 亚洲一区二区三区91| 亚洲AV无码之国产精品|