FastAPI框架學(xué)習(xí)

1. 什么是FastAPI?

FastAPI 是一個用于構(gòu)建 API 的現(xiàn)代诗舰、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于標(biāo)準(zhǔn)的 Python 類型提示,

fastapi 是python最快的web框架罗珍。

"""
特性:
1.快速,比肩go
2.編碼快速,開發(fā)快
3.減少人為bug
4.智能,自動補全, 減少調(diào)試時間
5.設(shè)計易于學(xué)習(xí),文檔簡單
6.簡短: 代碼量小,bug更少
7.健壯:生產(chǎn)場景,生成交互式文檔
8.標(biāo)準(zhǔn)化:基于API的相關(guān)的開放標(biāo)準(zhǔn)
"""

2.安裝

pip install fastapi

依賴

pip install uvicorn[standard]

3.最小愛快速示例:

import uvicorn
from typing import Optional, Set
from fastapi import FastAPI, Path, Query
from pydantic import BaseModel

app = FastAPI() # 這里的變量 app 會是 FastAPI 類的一個「實例」,這個實例將是創(chuàng)建你所有API 的主要交互對象,每個接口@app.get/put中的app。

class Item(BaseModel):
name: str
price: float
is_offer: Optional[bool] = None

@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}

@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}

3.1 命令運行:

uvicorn main:app --reload

3.2 代碼運行:

if name == 'main':

uvicorn.run(app=app, host="10.148.228.113", port=65500, workers=1)

4.性能優(yōu)異

基于 Uvicorn 運行的 FastAPI 程序是 最快的 Python web框架之一,支持異步和并發(fā)

5.類型提示:

同樣以冒號(:)來聲明這個變量脚粟。

6.Pydantic 模型?

Pydantic 是一個用來用來執(zhí)行數(shù)據(jù)校驗的 Python 庫。

7.路徑操作裝飾器

在開發(fā) API 時蘸朋,你通常使用特定的 HTTP 方法去執(zhí)行特定的行為

POST:創(chuàng)建數(shù)據(jù)核无。

GET:讀取數(shù)據(jù)。

PUT:更新數(shù)據(jù)藕坯。

DELETE:刪除數(shù)據(jù)团南。

8.fastapi程序的步驟:

導(dǎo)入 FastAPI。

創(chuàng)建一個 app 實例炼彪。

編寫一個路徑操作裝飾器(如 @app.get("/"))吐根。

編寫一個路徑操作函數(shù)(如上面的 def root(): ...)。

運行開發(fā)服務(wù)器(如 uvicorn main:app --reload)辐马。

9.路徑參數(shù)

路徑參數(shù) item_id 的值將作為參數(shù) item_id 傳遞給你的函數(shù)

由于路徑操作是按順序依次運行的拷橘,你需要確保路徑 /users/me 聲明在路徑 /users/{user_id}之前:

否則,/users/{user_id} 的路徑還將與 /users/me 相匹配喜爷,"認(rèn)為"自己正在接收一個值為 "me" 的 user_id 參數(shù)冗疮。

10.查詢參數(shù)

聲明不屬于路徑參數(shù)的其他函數(shù)參數(shù)時,它們將被自動解釋為"查詢字符串"參數(shù)

查詢字符串是鍵值對的集合檩帐,這些鍵值對位于 URL 的 术幔? 之后,并以 & 符號分隔湃密。

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]

11.請求體參數(shù)

請求體是客戶端發(fā)送給 API 的數(shù)據(jù)诅挑。響應(yīng)體是 API 發(fā)送給客戶端的數(shù)據(jù)四敞。

注意: 要發(fā)送數(shù)據(jù),你必須使用下列方法之一:POST(較常見)拔妥、PUT忿危、DELETE 或 PATCH。

"""
使用 Pydantic 模型來聲明請求體
from pydantic import BaseModel
當(dāng)一個模型屬性具有默認(rèn)值時毒嫡,它不是必需的

"""

class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None

12.查詢參數(shù)和字符串校驗

當(dāng)你在使用 Query 且需要聲明一個值是必需的時癌蚁,可以將 ... 用作第一個參數(shù)值:

"""
通用的校驗和元數(shù)據(jù):
alias
title
description
deprecated
特定于字符串的校驗:
min_length
max_length
regex
"""

13.路徑參數(shù)和數(shù)值校驗

可以使用 Path 為路徑參數(shù)聲明相同類型的校驗和元數(shù)據(jù)。

路徑參數(shù)總是必需的兜畸,因為它必須是路徑的一部分努释。

所以,你應(yīng)該在聲明時使用 ... 將其標(biāo)記為必需參數(shù)咬摇。

然而伐蒂,即使你使用 None 聲明路徑參數(shù)或設(shè)置一個其他默認(rèn)值也不會有任何影響,它依然會是必需參數(shù)肛鹏。

sla_id: str = Path(None, description="SLA的id", example="100191918"))

數(shù)值校驗

gt:大于(greater than)

le:小于等于(less than or equal)

item_id: int = Path(..., title="The ID of the item to get", gt=0, le=1000),

14.請求體--多個參數(shù):

async def update_item(item_id: int, item: Item = Body(..., embed=True)):

這里的 embed 參數(shù)為true時候, 將原本的請求體嵌入到一個鍵中逸邦。

'''{
"item": {
"name": "Foo",
"description": "The pretender",
"price": 42.0,
"tax": 3.2
}
}

而不是:
{
"name": "Foo",
"description": "The pretender",
"price": 42.0,
"tax": 3.2
}

'''

15.請求體 - 字段(Pydantic 的 Field)

與使用 Query、Path 和 Body 在路徑操作函數(shù)中聲明額外的校驗和元數(shù)據(jù)的方式相同在扰,

你可以使用 Pydantic 的 Field 在 Pydantic 模型內(nèi)部聲明校驗和元數(shù)據(jù)缕减。

Field 的工作方式和 Query、Path 和 Body 相同芒珠,包括它們的參數(shù)等等也完全相同桥狡。

16.請求體--嵌套模型

from pydantic import BaseModel, HttpUrl

class Image(BaseModel):
url: HttpUrl
name: str

class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
tags: Set[str] = set()
image: Optional[Image] = None

17.模式的額外信息

class Config:

schema_extra

聲明您的應(yīng)用可以接收的數(shù)據(jù)示例。

同樣的方法皱卓,你可以添加你自己的額外信息裹芝,這些信息將被添加到每個模型的JSON模式中,例如定制前端用戶界面娜汁,等等嫂易。

18.cookie參數(shù)

Cookie 、Path 掐禁、Query是兄弟類怜械,它們都繼承自公共的 Param 類

async def read_items(ads_id: Optional[str] = Cookie(None)):

19.Header 參數(shù)

token=Header(..., alias="X-Auth-Token", title="X-Auth-Token", description="請求token"),

不用擔(dān)心變量中的下劃線,F(xiàn)astAPI 會負(fù)責(zé)轉(zhuǎn)換它們傅事。

21.響應(yīng)模型

在下面的任意的路徑操作中使用 response_model 參數(shù)來聲明用于響應(yīng)的模型:

@app.get()

@app.post()

@app.put()

@app.delete()

response_model是「裝飾器」方法(get宫盔,post 等)的一個參數(shù)。不像之前的所有參數(shù)和請求體享完,它不屬于路徑操作函數(shù)灼芭。

"""
例子:
@api.post(
"/restores/{copy_id}/action/download",
status_code=200,
tags=API_TAG,
description="Download API",
summary="download",
response_model=DownloadResponseSchema
)

"""

22.響應(yīng)狀態(tài)碼

@app.post("/items/", status_code=201)

會在交互式文檔中展示返回在這里定義的狀態(tài)碼

23.表單數(shù)據(jù) Form

24.文件上傳

from fastapi import FastAPI, File, UploadFile

24.請求表格和文件

async def create_file(

file: bytes = File(...), fileb: UploadFile = File(...), token: str = Form(...)

):

當(dāng)您需要在同一請求中接收數(shù)據(jù)和文件時File,F(xiàn)orm一起使用和般又。

25.請注意彼绷,response_description特指響應(yīng)巍佑,description泛指路徑操作。

description可以使用長字符串或者多行文本寄悯。用于docs中api接口描述;參數(shù)response_description用于響應(yīng)描述萤衰。。

26.tags 參數(shù): 你可以給路徑操作(post, put, get, delete)函數(shù)添加標(biāo)記猜旬,通過tags參數(shù)脆栋,參數(shù)類型可以是list或者str(一般是一個str):

主要作用就是在docs交互文檔中進(jìn)行 模塊之間的分割,mysql模塊, filesets 模塊

27.總結(jié)(summary)和描述(description)

28.Json兼容(將對象轉(zhuǎn)化為json)

from typing import Optional
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
class Item(BaseModel):
title: str
timestamp: str
description: Optional[str] = None

item = Item(title='nanfanfa',timestamp="2021.6.21")
json_compatible_item_data = jsonable_encoder(item)
print(json_compatible_item_data) # {'title': 'nanfanfa', 'timestamp': '2021.6.21', 'description': None}
print(json_compatible_item_data) # {'title': 'nanfanfa', 'timestamp': '2021.6.21', 'description': None}

29.

30.

31.

32.

if name == 'main':
uvicorn.run(app=app, host="10.148.228.113", port=65500, workers=1)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洒擦,隨后出現(xiàn)的幾起案子椿争,更是在濱河造成了極大的恐慌,老刑警劉巖熟嫩,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秦踪,死亡現(xiàn)場離奇詭異,居然都是意外死亡掸茅,警方通過查閱死者的電腦和手機椅邓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昧狮,“玉大人景馁,你說我怎么就攤上這事《好” “怎么了裁僧?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慕购。 經(jīng)常有香客問我,道長茬底,這世上最難降的妖魔是什么沪悲? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮阱表,結(jié)果婚禮上殿如,老公的妹妹穿的比我還像新娘。我一直安慰自己最爬,他們只是感情好涉馁,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爱致,像睡著了一般烤送。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糠悯,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天帮坚,我揣著相機與錄音妻往,去河邊找鬼。 笑死试和,一個胖子當(dāng)著我的面吹牛讯泣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阅悍,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼好渠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了节视?” 一聲冷哼從身側(cè)響起拳锚,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肴茄,沒想到半個月后晌畅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡寡痰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年抗楔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拦坠。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡连躏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贞滨,到底是詐尸還是另有隱情入热,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布晓铆,位于F島的核電站勺良,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏骄噪。R本人自食惡果不足惜尚困,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望链蕊。 院中可真熱鬧事甜,春花似錦、人聲如沸滔韵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陪蜻。三九已至邦马,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勇婴。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工忱嘹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耕渴。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓拘悦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親橱脸。 傳聞我的和親對象是個殘疾皇子础米,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容