fastapi小技巧
1、定制文档生成:
参见 fastapi/applycations.py 中的setup. /docs 把所有的路径routes 都包含进去了。参考实现根据tag 实现文档生成。
要先生成docs 需要的openapi_url。(其中get_openapi 是fastapi.openapi.utils 内部的函数)
@app.get("/api/docs/{tag}/openapi.json",include_in_schema=False) async def docs_tag(tag:str) -> JSONResponse: openapi_schema = get_openapi( title=app.title, version=app.version, openapi_version=app.openapi_version, description=app.description, routes=[router for router in app.routes if tag in getattr(router,"tags",[]) ], tags=app.openapi_tags, servers=app.servers, ) return JSONResponse(openapi_schema)
再定义tag 的前端页面部分:
@app.get("/docs/{tag}",include_in_schema=False) async def get_documentation_tag_api(tag:str): return get_swagger_ui_html(openapi_url=f"/api/docs/{tag}/openapi.json", title="docs")
2、"response_model" para cannot be a local model
这是我提交了一个fastapi 的一个bug。详情见:https://github.com/tiangolo/fastapi/issues/4103
Description
【error】"response_model" para cannot be a local model
【suggest】: rewrite \pydantic\schema.py L303 function get_model_name_map
in L324 insert:
long_model_name =get_long_model_name(model)
if "<locals>" in long_model_name: # 这个不是冲突,只是用户动态生成的mata class
# 生成随机串,直到不冲突
while True:
random_str=str(random.randint(1111111,9999999))
if f"{model_name}_{random_str}" not in name_model_map:
name_model_map[f"{model_name}_{random_str}"] = model
break
continue
donot forget add dependents
版本如下:
fastapi==0.63.0 Python== 3.7.6 pydantic==1.8.1