路径操作元信息配置
"""操作路径元数据配置"""
@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: str
timestamp: datetime
description: 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] = None
des: Optional[str] = None
price: Optional[float] = None
tax: float = 10.5
items = {
"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)
# 生成不含模型默认值的dict
update_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 StaticFiles
from fastapi.templating import Jinja2Templates
app = FastAPI()
# 静态文件配置
app.mount("/static", StaticFiles(directory="static"), name="static")
# 实例化一个模板引擎对象,指定模板所在路径
templates = Jinja2Templates(directory='templates')
CORS跨域资源共享
设置cors跨域请求步骤如下:
- 导入 CORSMiddleware
- 创建一个允许的源列表
- 将其作为中间件添加到FastAPI应用中
from fastapi.middleware.cors import CORSMiddleware
app = 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