微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个端点中的多个功能 fastapi

如何解决一个端点中的多个功能 fastapi

我正在尝试创建一个音频服务器,我可以在其中上传各种音频文件我有一个要求,我只能创建一个用于创建的端点,我想出了这个,但它确实显示了输入数据的请求表单。

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,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,uploadTime=request.uploadTime)
            db.add(new_audiobook)
            db.commit()
            db.refresh(new_audiobook)
            return new_audiobook

解决方法

您的方法不接受 request 对象,而只接受 audio_type
此外,根据我从您的代码中了解到的情况,您可能有多个请求正文(schemas,如您所指)

您有两种选择:

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

    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 不会提供模式示例,您必须手动提供示例,(这可能也可能不可能,我真的不知道也没有尝试过:/)>

  2. 或者您可以拥有一个可以接受所有内容作为 Optionalaudio_type 参数的架构:

    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 ... 块内使用您想要创建歌曲、播客或有声读物的代码!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?