路径操作元信息配置
"""操作路径元数据配置"""@app.post("/items14/",response_model=Item14,summary="这是摘要",# description="这是描述",)async def create_item(item: Item14):"""Create an item with all the information:- **name**: each item must have a name- **description**: a long description- **price**: required- **tax**: if the item doesn't have tax, you can omit this- **tags**: a set of unique tag strings for this item"""return item

json兼容-jsonable_encoder
当数据需要存储到数据库,数据库不会接受pydantic模型,可以通过jsonable_encoder转换模型对象为dict对象
class Item15(BaseModel):title: strtimestamp: datetimedescription: Optional[str] = None@app.put("/update_item15/{id}")async def update_item15(id: str, item15: Item15):logger.info(f"item15: {type(item15)}") # item15: <class 'test.Item15'>json_data = jsonable_encoder(item15)logger.info(f"json_data: {type(json_data)}") # json_data: <class 'dict'>return json_data
pydantic模型更新
数据更新步骤如下:\
- 提取存储的数据 \
- 将提取的数据放入模型中
- 生成不含模型默认值的dict,只更新用户设置的值
- 将已存储的模型创建副本,接收其更新属性
- 将更新的模型转化为数据库可存储的数据格式
"""pydantic模型更新"""class Item16(BaseModel):name: Optional[str] = Nonedes: Optional[str] = Noneprice: Optional[float] = Nonetax: float = 10.5items = {"foo": {"name": "Foo", "price": 50.2},"bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2},"baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5},}@app.put('/items16/{item_id}', response_model=Item16)async def update_item16(item_id: str, item: Item16):# 提取存储的数据stored_item_data = items[item_id]logger.info(f"stored_item_data: {stored_item_data}") # stored_item_data: {'name': 'Foo', 'price': 50.2}# 将提取的数据重新放入模型stored_item_model = Item16(**stored_item_data)# 生成不含模型默认值的dictupdate_data = item.dict(exclude_unset=True)logger.info(f"update_data: {update_data}") # update_data: {'name': 'string', 'des': '描述', 'price': 10.0, 'tax': 110.5}# 为已存储的模型创建副本,并接收更新其属性updated_item = stored_item_model.copy(update=update_data)logger.info(f"updated_item: {updated_item}") # updated_item: name='string' des='描述' price=10.0 tax=110.5# 将模型再次转化为可存入数据库的形式items[item_id] = jsonable_encoder(updated_item)logger.info(f"items[item_id]: {items[item_id]}") # items[item_id]: {'name': 'string', 'des': '描述', 'price': 10.0, 'tax': 110.5}# 返回更新后的模型return updated_item
静态文件&模板挂载
from fastapi.staticfiles import StaticFilesfrom fastapi.templating import Jinja2Templatesapp = FastAPI()# 静态文件配置app.mount("/static", StaticFiles(directory="static"), name="static")# 实例化一个模板引擎对象,指定模板所在路径templates = Jinja2Templates(directory='templates')
CORS跨域资源共享
设置cors跨域请求步骤如下:
- 导入 CORSMiddleware
- 创建一个允许的源列表
- 将其作为中间件添加到FastAPI应用中
from fastapi.middleware.cors import CORSMiddlewareapp = FastAPI()origins = ["https://localhost","http://localhost:8080"]app.add_middleware(CORSMiddleware,allow_origins=origins,allow_credentials=True,allow_methods=["*"],allow_headers=["*"])
CORSMiddleware支持的参数如下:
- allow_origins: 一个允许跨域请求的源列表,[‘*’] 允许任何源
- allow_origin_regex: 匹配的源允许跨域请求
- allow_methods: 一个允许跨域请求的 HTTP 方法列表, 使用 [‘*’] 来允许所有标准方法
- allow_headers:一个允许跨域请求的 HTTP 请求头列表,使用 [‘*’] 允许所有的请求头
- allow_credentials:跨域请求支持 cookies, 默认是 False,允许凭证时 allow_origins必须指定源
- expose_headers: 指示可以被浏览器访问的响应头。默认为 []
- max_age - 设定浏览器缓存 CORS 响应的最长时间,单位是秒。默认为 600
