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 pydanticschema.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

原文地址:https://www.cnblogs.com/xunhanliu/p/14950735.html