У меня возникли проблемы с тем, чтобы flet-fastapi возвращал FileResponse.
Мой рабочий каталог выглядит так:
Код: Выделить всё
__pycache__/
.venv/
output/
output/test.docx
main.py
requirements.txt
Код: Выделить всё
flet-fastapi
flet
uvicorn
pydantic
fastapi
Код: Выделить всё
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