fastapi 的 swagger response 怎么声明 media_type?

@app.post('/snapshot')
def snapshot(
    url: str = Form()
):
    proxy = get_proxy()
    with ChromeBrowser(driver_path=driver_path, proxy_string=proxy) as browser:
        # 截图
        logger.info(f'获得代理: {proxy}')

        jpg_stream: bytes = browser.snapshot(url)
        logger.debug(f'获取截图, 大小为 {round(len(jpg_stream)/1024,3)} KBytes')

        image_stream = BytesIO(jpg_stream)
        return StreamingResponse(image_stream, media_type="image/jpg")

有上面的接口,response body 不是一般的 json,而是一个图片流,所以我要怎么声明,才能让访问 /docs 的时候,让别人可以知道这个接口返回的是 image/jpg 而不是 json

图片.png

阅读 751
2 个回答

不需要声明,响应头中的Content-Type就会告诉客户端你的响应是什么类型。


docs 里的 media_type 是通过 response_class 实现的,需要自定义 response_class 才能修改。

from fastapi import FastAPI
from fastapi.responses import StreamingResponse

app = FastAPI()


class MyCustomResponse(StreamingResponse):
    media_type = "image/jpeg" # 将文件类型写在这里


@app.get("/img", response_class=MyCustomResponse)  # 指定 MyCustomResponse
def image():
    def iterfile():
        with open("./image.jpg", mode="rb") as file_like:
            yield from file_like

    return MyCustomResponse(iterfile())

截屏2023-11-16 14.04.01.png

推荐问题
宣传栏