Как вернуть FileResponse (или StreamingResponse) в flet-fastapi?Python

Программы на Python
Anonymous
Как вернуть FileResponse (или StreamingResponse) в flet-fastapi?

Сообщение Anonymous »

На самом деле я пытаюсь создать веб-приложение, которое запрашивало бы у человека некоторую информацию, а затем редактировало \*.docx с помощью jinja и возвращало этот \*.docx человеку в качестве скачать.
У меня возникли проблемы с тем, чтобы flet-fastapi возвращал FileResponse.
Мой рабочий каталог выглядит так:

Код: Выделить всё

__pycache__/
.venv/
output/
output/test.docx
main.py
requirements.txt
requirements.txt:

Код: Выделить всё

flet-fastapi
flet
uvicorn
pydantic
fastapi
main.py:

Код: Выделить всё

from contextlib import asynccontextmanager
import flet as ft
import flet_fastapi
from fastapi import FastAPI
from fastapi.responses import FileResponse

@asynccontextmanager
async def lifespan(app=FastAPI):
await flet_fastapi.app_manager.start()
yield
await flet_fastapi.app_manager.shutdown()

app = FastAPI(lifespan=lifespan)

# I believe that it doesn't matter which endpoint we choose here, since later we mount
# our flet on the root-path. Decorator is here because without it "return FileResponse()"
# does nothing at all.
@app.get("/")
async def dl_test(page: ft.Page):
async def download(e):
return FileResponse(f"output/test.docx", media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", filename="test.docx")
await page.add_async(ft.OutlinedButton(text="Get file", on_click=download))
await page.update_async()

app.mount("/", flet_fastapi.app(dl_test))
Этот код является минимальным воспроизводимым кодом.
Чтобы воспроизвести его, мы можем подготовить нашу виртуальную среду:

Код: Выделить всё

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
А затем запустите его:

Код: Выделить всё

uvicorn --reload main:app
При запуске мы видим исключение:

fastapi.Exceptions.FastAPIError: Неверные аргументы для ответа поле! Подсказка: убедитесь, что является допустимым типом поля Pydantic. Если вы используете аннотацию возвращаемого типа, которая не является допустимым полем Pydantic (например, Union[Response, dict, None]), вы можете отключить создание модели ответа из аннотации типа с помощью параметра декоратора операции пути response_model=None.

Как заставить работать функцию возврата FileResponse()?

Подробнее здесь: https://stackoverflow.com/questions/777 ... et-fastapi

Вернуться в «Python»