Python 一个端点fastapi中的多个函数

Python 一个端点fastapi中的多个函数,python,fastapi,Python,Fastapi,我试图创建一个音频服务器,在那里我可以上传各种音频文件,我有一个要求,我只能创建一个端点来创建,我已经想出了这个,但它确实显示了输入数据的请求表单 class AudioType(str, Enum): Song = "Song" Podcast = "Podcast" Audiobook = "Audiobook" @app.post("/{audio_type}", status_co

我试图创建一个音频服务器,在那里我可以上传各种音频文件,我有一个要求,我只能创建一个端点来创建,我已经想出了这个,但它确实显示了输入数据的请求表单

class AudioType(str, Enum):
    Song = "Song"
    Podcast = "Podcast"
    Audiobook = "Audiobook"


@app.post("/{audio_type}", status_code=status.HTTP_200_OK)
def audio(audio_type: AudioType):
    if audio_type == AudioType.Song:
        def create_song(request: schemas.Song, db: Session = Depends(database.get_db)):
            new_song = models.Song(name=request.name, duration=request.duration, uploadTime=request.uploadTime)
            db.add(new_song)
            db.commit()
            db.refresh(new_song)
            return new_song
    elif audio_type == AudioType.Podcast:
        def create_podcast(request: schemas.Podcast, db: Session = Depends(database.get_db)):
            new_podcast = models.Podcast(name=request.name,  duration=request.duration, uploadTime=request.uploadTime,                                         host=request.host)
            db.add(new_podcast)
            db.commit()
            db.refresh(new_podcast)
            return new_podcast
    elif audio_type == AudioType.Audiobook:
        def create_audiobook(request: schemas.Audiobook, db: Session = Depends(database.get_db)):
            new_audiobook = models.Audiobook(titile=request.title, author=request.author, narrator=request.narrator,                                              duration=request.duration, uploadTime=request.uploadTime)
            db.add(new_audiobook)
            db.commit()
            db.refresh(new_audiobook)
            return new_audiobook

您的方法不接受
请求
对象,只接受
音频类型

从我对代码的理解来看,您可能有多个请求主体(
schemas

有两个选项可供选择:

  • 您需要按如下方式声明端点:

    from typing import Union
    
    @app.post("/{audio_type}", status_code=status.HTTP_200_OK)
    def audio(
        request: Union[schemas.Song, schemas.Podcast, 
        schemas.Audiobook], audio_type: AudioType
    ):
        ... Your method ...
    
    但是fastapi的auto-swagger不会提供模式示例,您必须手动提供示例(这可能是可能的,也可能是不可能的,我真的不知道,也没有尝试过:/)

  • 或者您可以有一个模式,可以将所有内容都作为
    可选
    音频类型
    参数接受:

    from typing import Optional
    
    
    class EndpointSchema(BaseModel):
        audio_type: AudioType
        song: Optional[schemas.Song]
        podcast: Optional[schemas.Podcast]
        audiobook: Optional[schemas.Audiobook]
    
    
    @app.post("/audio", status_code=status.HTTP_200_OK)
    def audio(request_body: EndpointSchema):
        if request_body.audio_type == AudioType.Song:
            ... Continue with your request processing ...
    

  • 最后,非常重要:您正在声明内部方法(
    create_song
    等),之后您不会调用这些方法,因此您的代码不会执行任何操作。如果不需要这样做,请直接在
    if,elif…
    块中使用要创建歌曲、播客或有声读物的代码

    感谢您的回复,一旦我以Union的身份发出请求,我想知道如何在model.song()?@devgru中访问它们,您可以从
    request\u body
    对象访问它们。因此我尝试了Union解决方案,您是对的。swagger UI只显示第一个参数的模式,在第二个解决方案中,它显示了所有模式。有没有一种方法可以只显示一个指定音频的模式type@devgru我不确定,但我认为您必须手动扩展该端点的开放API:我读了这篇文章,但我不知道从这里走到哪里。你能提供更多的上下文吗?