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}