@app.get("/request01")
def request01():
raise HTTPException(status_code=401, detail={"custom": "自定义数据类型"}, headers={"Err-Msg": "123"})
return "hello world"
class MyException(Exception):
def __init__(self, msg):
self.msg = msg
@app.exception_handler(MyException)
async def my_exception_handler(request: Request, e: MyException):
return JSONResponse(
status_code=418,
content={"message": f"{e.msg}", "data": 123},
)
@app.get("/request02")
def request02():
raise MyException(msg="123")
return "hello world"
@app.exception_handler(RequestValidationError)
async def my_request_validation_exception(request: Request, e: RequestValidationError):
# 解析RequestValidationError的数据,重新拼接返回
rtype = e.raw_errors[0].loc_tuple()[0]
rkey = e.raw_errors[0].loc_tuple()[1]
msg = e.raw_errors[0].exc.msg_template
return JSONResponse(
status_code=418,
content=[rtype, rkey, msg]
)
@app.exception_handler(SelfException)
async def my_exception_handler1(request: Request, e: HTTPException):
print("hello exception")
return await http_exception_handler(request, e)
@app.get("/request03")
def request03(num: int = Query(...)):
return "hello world"
request01:使用raise抛出自定义的HTTPException,可以自定义status_code(这个status_code是在标准内的),可以定义返回的内容detail,也可以增加自定义的headers.
request02:自定义Exception,返回标准的status_code和自定义的content
my_request_validation_exception方法:覆盖其他的Exception,实现自定义功能
my_request_handler1方法:复用其他的Exception Handler,实现自定义功能
在@app.get()装饰器中加入响应的配置参数,优化API文档的显示。
@app.get("/request04", status_code=status.HTTP_401_UNAUTHORIZED, tags=["request"], summary="1", description="1",
response_description="1", deprecated=True)
def request04():
return "hello world"
status_code: 如果没有异常或者手动的抛出异常,都会返回指定的status_code
tags: 为该接口分组标示
summary, description, response_description:都是一些描述性文字,便于接口功能的理解
deprecated: 申明是否废弃,但是不影响接口的调用,只是在文档中标注废弃。
class Item(BaseModel):
a: datetime
b: date
c: int
d: str
e: bool
@app.post("/request05")
def request05(item: Item):
item1 = jsonable_encoder(item)
print(type(item1))
return item
@app.post("/request06")
def request06(item: List[Item]):
item1 = jsonable_encoder(item)
print(type(item1))
return item
通过jsonable_encoder转成对应的dict或者list,但是datetime,date,time会转化成标准化的时间字符串
在实际的业务中,会遇到各种情况对数据进行变换。
@app.post("/request07")
def request07(item: Item):
print(item.dict(by_alias=True))
print(item.dict(exclude_unset=True))
print(item.dict(exclude_none=True))
print(item.dict(exclude_defaults=True))
print(item.dict(exclude={"c", "d"}))
# copy方法
item1 = {"d": 1993}
print(item1)
item2 = item.copy(update=item1, deep=True)
return item2
BaseModel的dict()方法
by_alias: 转化成dict的时候,key使用BaseModel中设置的alias_name
exclude_unset: 转化成dict的时候,对于request-body中未设置的数据忽略,exclude_defaults和exclude_unset差不多。
exclude_none: 转化成dict的时候,忽略值是None的key
exclude: 传入转化成dict的时候,不需要的field
BaseModel的copy()方法
deep: 是否是深拷贝。
update:以dict数据更新item。然后复制给item2