如何使用 FastAPI 将下拉菜单添加到基于 BaseModel 的 Swagger UI autodocs?

aba*_*a2s 4 python swagger swagger-ui openapi fastapi

我有以下课程:

class Quiz(BaseModel):
    question: str
    subject: str
    choice: str = Query(choices=('eu', 'us', 'cn', 'ru'))
         
Run Code Online (Sandbox Code Playgroud)

我可以像这样基于此类渲染表单

@api.post("/postdata")
def post_data(form_data: Quiz = Depends()):
    return form_data
Run Code Online (Sandbox Code Playgroud)

如何显示选择字段的下拉列表?

Chr*_*ris 5

选项1

使用文字值。Literaltype 是 Python 标准库自 Python 3.8 起的新功能(在 Python 3.8 之前,它需要Typing-extensions包),并受 Pydantic 支持。例子:

from fastapi import FastAPI, Depends
from pydantic import BaseModel
from typing import Literal

app = FastAPI()
    
class Quiz(BaseModel):
    question: str
    subject: str
    choice: Literal['eu', 'us', 'cn', 'ru'] = 'us'

@app.post('/submit')
def post_data(data: Quiz = Depends()):
    return data
Run Code Online (Sandbox Code Playgroud)

选项2

使用Enums(另请参阅 Python 的enum模块,以及 FastAPI 关于预定义值的文档)。通过让您的Enum子类继承自str,API 文档将能够知道这些值必须是类型string并且能够正确呈现。例子:

from fastapi import FastAPI, Depends
from pydantic import BaseModel
from enum import Enum

app = FastAPI()

class Country(str, Enum):
    eu = 'eu'
    us = 'us'
    cn = 'cn'
    ru = 'ru'
    
class Quiz(BaseModel):
    question: str
    subject: str
    choice: Country = Country.us
    
@app.post('/submit')
def post_data(data: Quiz = Depends()):
    return data
Run Code Online (Sandbox Code Playgroud)