46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
import os
|
||
import flet as ft
|
||
import httpx
|
||
import designer as ds
|
||
from router import setup_router
|
||
from starlette.applications import Starlette
|
||
from starlette.routing import Route, Mount
|
||
from starlette.responses import Response as StarletteResponse
|
||
|
||
_API_URL = os.getenv("API_URL", "http://api:8000")
|
||
|
||
|
||
async def _radar_image(request):
|
||
"""Проксирует SVG-диаграмму с API — браузер скачивает с собственного хоста."""
|
||
response_id = request.path_params["response_id"]
|
||
try:
|
||
async with httpx.AsyncClient(timeout=10) as client:
|
||
r = await client.get(f"{_API_URL}/responses/{response_id}/radar/image")
|
||
if r.status_code == 200:
|
||
return StarletteResponse(
|
||
content=r.content,
|
||
media_type="image/svg+xml",
|
||
headers={"Content-Disposition": 'attachment; filename="diagram.svg"'},
|
||
)
|
||
except Exception:
|
||
pass
|
||
return StarletteResponse(status_code=404)
|
||
|
||
|
||
async def main(page: ft.Page):
|
||
page.title = "COPP"
|
||
page.bgcolor = ds.clolors.background
|
||
setup_router(page)
|
||
initial = page.route if page.route and page.route not in ("/", "") else "/login"
|
||
await page.push_route(initial)
|
||
|
||
|
||
_flet_app = ft.run(main, export_asgi_app=True, assets_dir="assets")
|
||
|
||
app = Starlette(
|
||
routes=[
|
||
Route("/radar-image/{response_id}", _radar_image),
|
||
Mount("/", _flet_app),
|
||
]
|
||
)
|