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}

自动转换

头部变量的变量名与 http 头部的变量名之间会经过一个转换过程,把变量名转变为小写,且横线 - 转换为下划线 _ ,比如头部是 User-Agent ,转换后就是 user_agent 。这是因为在Python中变量名不能用横线。

重复的头变量

如果我们在请求头里对一个变量设置了多个值,那么 fastapi 会把这些值都取出来存入一个 List 中。

响应模型(Responce Model)

响应模型是可以用来控制响应体中的数据,按照一定方式组织后返回的操作方法。比如我们可以对数据进行过滤、

使用响应模型,需要在路由函数中指定 response_model 对应的类,然后使用 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,   # 指定响应模型
    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查看结果。

在路由方法中,我们还可以设置 response_model_exclude_unset=True ,这样就只会返回非空的那些字段。

多个Model

我们的 Model 之间还可以有继承关系,这样可以减少重复,例如:

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

响应模型为列表

我们得响应模型还可以是列表格式,例如:

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

响应模型为任意的字典类型

响应模型还可以是 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}

响应状态码

在装饰器中可以使用 status_code 参数来指定响应的状态码,可以使用整数如 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的数据依然会被返回,这样是为了前后端分离考虑的。

你可能感兴趣的:(FastAPI 教程(六))