FastAPI 教程(六)

Cookie 變量

從 fastapi 引入 Cookie 后,可以使用類似 Query应民、Path 的方式來獲取 cookie 的值话原,例如:

from typing import Optional
from fastapi import Cookie, FastAPI

app = FastAPI()


@app.get("/items/")
async def read_items(ads_id: Optional[str] = Cookie(None)):
    return {"ads_id": ads_id}

頭部變量(Header Parameters)

從 fastapi 中引入 Header 后,就可以用類似 Query诲锹、Cookie 的方式來獲取頭部變量的值繁仁,例如:

from typing import Optional
from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Optional[str] = Header(None)):
    return {"User-Agent": user_agent}

自動轉(zhuǎn)換

頭部變量的變量名與 http 頭部的變量名之間會經(jīng)過一個轉(zhuǎn)換過程,把變量名轉(zhuǎn)變?yōu)樾懝樵埃覚M線 - 轉(zhuǎn)換為下劃線 _ 黄虱,比如頭部是 User-Agent ,轉(zhuǎn)換后就是 user_agent 庸诱。這是因為在Python中變量名不能用橫線捻浦。

重復(fù)的頭變量

如果我們在請求頭里對一個變量設(shè)置了多個值晤揣,那么 fastapi 會把這些值都取出來存入一個 List 中。

響應(yīng)模型(Responce Model)

響應(yīng)模型是可以用來控制響應(yīng)體中的數(shù)據(jù)朱灿,按照一定方式組織后返回的操作方法昧识。比如我們可以對數(shù)據(jù)進(jìn)行過濾、

使用響應(yīng)模型母剥,需要在路由函數(shù)中指定 response_model 對應(yīng)的類滞诺,然后使用 response_model_include 或 response_model_exclude 來指定要包含的字段或要排除的字段。例如:

from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


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


items = {
    "foo": {"name": "Foo", "price": 50.2},
    "bar": {"name": "Bar", "description": "The Bar fighters", "price": 62, "tax": 20.2},
    "baz": {
        "name": "Baz",
        "description": "There goes my baz",
        "price": 50.2,
        "tax": 10.5,
    },
}


@app.get(
    "/items/{item_id}/name",
    response_model=Item,   # 指定響應(yīng)模型
    response_model_include=["name", "description"],   # 選取要返回的字段
)
async def read_item_name(item_id: str):
    return items[item_id]


@app.get(
    "/items/{item_id}/public", 
    response_model=Item, 
    response_model_exclude=["tax"]    # 選取要排除的字段
)
async def read_item_public_data(item_id: str):
    return items[item_id]

接下來可以訪問 http://localhost:8000/items/baz/public 以及http://localhost:8000/items/baz/name查看結(jié)果环疼。

在路由方法中习霹,我們還可以設(shè)置 response_model_exclude_unset=True ,這樣就只會返回非空的那些字段炫隶。

多個Model

我們的 Model 之間還可以有繼承關(guān)系淋叶,這樣可以減少重復(fù),例如:

from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
import hashlib

app = FastAPI()


class UserBase(BaseModel):
    username: str
    email: str
    full_name: Optional[str] = None


class UserIn(UserBase):
    password: str


class UserInDB(UserBase):
    hashed_password: str


def fake_save_user(user_in: UserIn):
    salted_password = 'mysalt' + user_in.password
    hashed_password = hashlib.md5(salted_password.encode(encoding="UTF-8")).hexdigest()
    user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)
    print("User saved! ..not really")
    return user_in_db


@app.post("/user/", response_model=UserInDB)
async def create_user(user_in: UserIn):
    user_saved = fake_save_user(user_in)
    return user_saved

響應(yīng)模型為列表

我們得響應(yīng)模型還可以是列表格式伪阶,例如:

from typing import List
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str


items = [
    {"name": "Foo", "description": "There comes my hero"},
    {"name": "Red", "description": "It's my aeroplane"},
]


@app.get("/items/", response_model=List[Item])  # Item 的列表
async def read_items():
    return items

響應(yīng)模型為任意的字典類型

響應(yīng)模型還可以是 typing 中引入的 Dict 類型煞檩,例如:

from typing import Dict
from fastapi import FastAPI

app = FastAPI()


@app.get("/keyword-weights/", response_model=Dict[str, float])
async def read_keyword_weights():
    return {"foo": 2.3, "bar": 3.4}

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

在裝飾器中可以使用 status_code 參數(shù)來指定響應(yīng)的狀態(tài)碼,可以使用整數(shù)如 200栅贴,404等斟湃,也可以從 fastapi 中引入 status 后使用常量,例如:

from fastapi import FastAPI

app = FastAPI()


@app.post("/items/", status_code=201)
async def create_item(name: str):
    return {"name": name}

@app.get("/errors/", status_code=404)
async def errors():
    return {"name": "404 HTTP Not Found"}

值得注意的是檐薯,即便是404錯誤凝赛,JSON的數(shù)據(jù)依然會被返回,這樣是為了前后端分離考慮的坛缕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墓猎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赚楚,更是在濱河造成了極大的恐慌毙沾,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宠页,死亡現(xiàn)場離奇詭異左胞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)举户,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門烤宙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敛摘,你說我怎么就攤上這事∪橛洌” “怎么了兄淫?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵屯远,是天一觀的道長。 經(jīng)常有香客問我捕虽,道長慨丐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任泄私,我火速辦了婚禮房揭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晌端。我一直安慰自己捅暴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布咧纠。 她就那樣靜靜地躺著蓬痒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漆羔。 梳的紋絲不亂的頭發(fā)上梧奢,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機(jī)與錄音演痒,去河邊找鬼亲轨。 笑死,一個胖子當(dāng)著我的面吹牛鸟顺,可吹牛的內(nèi)容都是我干的惦蚊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼诊沪,長吁一口氣:“原來是場噩夢啊……” “哼养筒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起端姚,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤晕粪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渐裸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巫湘,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年昏鹃,在試婚紗的時候發(fā)現(xiàn)自己被綠了尚氛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡洞渤,死狀恐怖阅嘶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤讯柔,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布抡蛙,位于F島的核電站,受9級特大地震影響魂迄,放射性物質(zhì)發(fā)生泄漏粗截。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一捣炬、第九天 我趴在偏房一處隱蔽的房頂上張望熊昌。 院中可真熱鬧,春花似錦湿酸、人聲如沸婿屹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽选泻。三九已至,卻和暖如春美莫,著一層夾襖步出監(jiān)牢的瞬間页眯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工厢呵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窝撵,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓襟铭,卻偏偏與公主長得像碌奉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寒砖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348