FastAPI 2 响应及配置

FastAPI 响应及配置

1.Response Model 响应模型

from fastapi import APIRouter, status, Form, File, UploadFile, HTTPException
from pydantic import BaseModel, EmailStr
from typing import Optional, List, Union

app04 = APIRouter()
"""Response Model 响应模型"""


class UserIn(BaseModel):
    name: str
    pwd: str
    email: EmailStr
    phone: str = '10086'
    address: str = None
    full_name: Optional[str] = None


class UserOut(BaseModel):
    name: str
    email: EmailStr
    phone: str = '10086'
    address: str = None
    full_name: Optional[str] = None


users = {
    'user01': {'name': "user01", "pwd": '123123', 'email': '112233442@qq.com'},
    'user02': {'name': "user02", "pwd": '123456', 'email': '556677880@qq.com', 'phone': '13323232233'},
}


# path operation 路径操作
@app04.post('/response_model', response_model=UserOut, response_model_exclude_unset=True)
async def response_model(user: UserIn):
    """response_model_exclude_unset=True 表示默认值不包含在响应中,仅包含实际给的值,如果实际给的值与默认值相同也会包含在响应中"""
    print(user.pwd)
    return users["user01"]


@app04.post(
    "/response_model/attributes",
    response_model=UserOut,  # 被返回的类型
    # response_model=Union[UserIn,UserOut],  # Union[UserIn,UserOut] UserIn与UserOut的字段的并集
    # response_model=List[UserOut],  # List[UserOut,UserOut1,UserOut2] List中任意一个模型类都可以返回
    # response_model_include={'name','email', 'phone'},  # response_model_include列出需要在返回结果中包含的字段
    response_model_exclude={"phone"},  # response_model_exclude列出需要在返回结果中排除的字段
)
async def response_model_attributes(user: UserIn):
    # del user.pwd  # Union[UserIn,UserOut]后, 删除password属性也能成功返回
    return user

2.Response Status Code 响应状态码

"""Response Status Code 响应状态码"""


@app04.post('/status_code', status_code=200)
async def status_code():
    return {"status_code": 200}


@app04.post('/status_attribute', status_code=status.HTTP_200_OK)
async def status_attribute():
    print(type(status.HTTP_200_OK))
    return {"status_code": status.HTTP_200_OK}

3.Form Data 表单处理数据

"""Form Data 表单处理数据"""


@app04.post('/login')
async def login(
        username: str = Form(...),
        password: str = Form(...)  # 定义表单参数
):
    """用Form类需要pip install python-multipart; Form类的元数据和校验方法类似于Body/Query/Path/Cookie"""
    return {"username": username}

4.Request Files 单文件、多文件上传及参数详解

"""Request Files 单文件、多文件上传及参数详解"""


@app04.post('/file')
async def file_(file: bytes = File(...)):  # 上传单个文件
    """使用File类 文件内容会以bytes的形式读入内存 适合小文件上传"""
    return {"file_size": len(file)}


@app04.post('/files')
async def file_s(files: List[bytes] = File(...)):  # 上传多个文件
    """使用File类 文件内容会以bytes的形式读入内存 适合小文件上传"""
    return {"file_size": len(files[0]) + len(files[1])}


@app04.post('upload_files')
async def upload_files(files: List[UploadFile] = File(...)):  # 如果上传单个文件 file:UploadFile = File(...)
    """
    使用UploadFile类的优势:
    1.文件存储在内存中,使用的内存达到阈值后,将被保存在磁盘中
    2.适合于图片、视频大文件
    3.可以获取上传文件的元数据,如文件名,创建时间等
    4.有文件对象的异步接口
    5.上传的文件是Python文件对象,可以使用write(), read(), seek(), close()操作
    :param files:
    :return:
    """

    for file in files:
        contents = await file.read()
        print(contents)
    return {"filename": files[0].filename, "content_type": files[0].content_type}

5.FastAPI项目的静态文件的配置

在run.py添加

from fastapi.staticfiles import StaticFiles
# mount表示将某个目录下一个完全独立的应用挂载过来,这个不会在API交互文档中显示
app.mount(path='/static', app=StaticFiles(directory='./coronavirus/static'), name='static')

6.Path Operation Configuration 路径操作配置

"""Path Operation Configuration 路径操作配置"""


@app04.post(
    '/path_operation_configuration',
    response_model=UserOut,
    # tags=["Path", "Operation", "Configuration"],
    summary="This is summary",
    description="This is description",
    response_description="This is response description",
    # deprecated=True,  # 废弃该接口
    status_code=status.HTTP_200_OK
)
async def path_operation_configuration(user: UserIn):
    """
    Path Operation Configuration 路径操作配置
    :param user: 用户信息
    :return: 返回结果
    """
    return user.dict()

7.FastAPI 应用的常见配置项

在run.py添加

app = FastAPI(
    title='FastAPI Tutorial and Coronavirus Tracker API Docs', 
    description="FastAPI Study", 
    version='1.0.0',
    docs_url='/docs',
    redoc_url='/redocs',
)

8.Handling Errors 错误处理

"""Handling Errors 错误处理"""@app04.get("/http_exception")async def http_exception(city: str):    if city != "Shanghai":        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="City is not found!",                            headers={"X-Error": "Error"})    return {"city": city}@app04.get("/http_exception/{city_id}")async def overwrite_http_exception(city_id: int):    if city_id == 1:        raise HTTPException(status_code=418, detail="No! not allowed 1!")    return {"city_id": city_id}
posted @ 2021-04-27 19:17  橘丶阳菜  阅读(305)  评论(0编辑  收藏  举报