美文网首页
用FastAPI构架API/endpoint, 2023-06-

用FastAPI构架API/endpoint, 2023-06-

作者: Mc杰夫 | 来源:发表于2023-06-10 11:24 被阅读0次

(2023.06.08 Thur @KLN HK)

FastAPI构建API/endpoint过程中建议使用pydantic包实现data validation,同时建议使用python enum实现元素枚举。

在endpoint中添加example

实现这一endpoint需要若干步骤

  • 预先定义Response Model和Request Model,以及需要在endpoint中展示的filter example
  • 在入口函数的API/endpoint中添加response&request model

(2023.06.11 Sun @SZ 颖隆大厦)
具体案例如下:

models.py中通过pydantic的BaseModel定义Request Model和Response Model,以及filter example.

# models.py
from pydantic import BaseModel
from datetime import datetime


class RequestModel(BaseModel):
    start_: str
    end_: str
    ids: list[str] = []
    cons = 100


class ResponseModel(BaseModel):
    res_count: int = 0
    res1: list[dict] = []
    res2: list[dict] = []


filter_examples = {
    "example1": {
        "summary": "example 1 - demo 1",
        "description": "this is a description",
        "value": {
            "start_": "value1",
            "end_": "value2",
            "ids": ["value3"]
        },
    }
}

在FastAPI的入口文件main-api.py中代码如下

# main-api.py
from fastapi import FastAPI, Query, Body
from models import RequestModel, ResponseModel, filter_examples
from fastapi.openapi.docs import get_swagger_ui_html

app = FastAPI()

@app.post("/endpoint1/", tags=["show-examples"], response_model=ResponseModel)
async def func_ep1(requests_model: RequestModel=Body(examples=filter_examples)):
    res = {'res_count': requests_model.cons, 'res1': [{"start_": requests_model.start_}],
           'res2': [{"end_": requests_model.end_}]}
    return res


@app.get("/docs")
def read_docs():
    return get_swagger_ui_html(openapi_url="/openapi.json")

其中的@app.get("/docs")部分设定swagger UI。

endpoint1的函数中定义requests_model,并将其中的值传递给返回结果。

在endpoint中加入下拉列表

需要使用fastapi中的Query方法。

models.py文件中加入Enum对象,给出下拉列表的元素。

# models.py
from enum import Enum
class someClassEnum(str, Enum):
    field_a = "a"
    field_b = "b"
    field_c = "c"

在入口文件中加入对应的endpoint

# main-api.py
from fastapi import FastAPI, Query, Body
from models import  someClassEnum

app = FastAPI()

@app.get("/endpoint2", tags=["dropdown-list"])
async def func_ep2(data_field: someClassEnum = Query(someClassEnum.field_a)) -> dict:
    return {"req_name": data_field.name, "req_value": data_field.value}

返回结果中有下拉列表


dropdown list in FastAPI

相关文章

网友评论

      本文标题:用FastAPI构架API/endpoint, 2023-06-

      本文链接:https://www.haomeiwen.com/subject/fxkoedtx.html