feat: Add new API endpoints and HTML pages for ML model management
- Implemented HTML pages for datasets, models, training, testing, and results. - Created API endpoints for managing repositories, results, tests, and training sessions. - Added functionality for streaming training progress via Server-Sent Events (SSE). - Introduced a Dockerfile for the ML runner with necessary dependencies. - Developed an SDK for user code execution within the runner container. - Enhanced CSS styles for improved UI layout and navigation. - Established a layout template for consistent HTML structure across pages. - Added JavaScript for dynamic interactions on the models page. - Implemented WebSocket handling for real-time communication with kiosk devices and controllers. - Implemented model registration and management API at /api/models - Added Gitea proxy API for repository interactions at /api/repos - Created results API for listing and comparing training results at /api/results - Developed training management API for enqueueing and retrieving training jobs at /api/trainings - Introduced SSE endpoint for live training progress updates - Added HTML pages for models, datasets, and training management - Created a Dockerfile for the ML runner with necessary dependencies - Developed SDK for user code execution within the runner container - Enhanced CSS styles for improved UI/UX - Implemented WebSocket communication for real-time device and controller interactions in the kiosk system
This commit is contained in:
75
ml/routers/pages.py
Normal file
75
ml/routers/pages.py
Normal file
@@ -0,0 +1,75 @@
|
||||
"""Pagine HTML servite direttamente da ml.mebboat.it.
|
||||
|
||||
Layout:
|
||||
/ redirect a /datasets (o landing console)
|
||||
/datasets lista/upload dataset
|
||||
/models registro modelli
|
||||
/train avvia training
|
||||
/test esegue test su modello trainato
|
||||
/results storico e confronto risultati
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
from fastapi import APIRouter, Depends, Request
|
||||
from fastapi.responses import HTMLResponse, RedirectResponse
|
||||
from fastapi.templating import Jinja2Templates
|
||||
|
||||
from core.auth import _verify
|
||||
from core.config import settings
|
||||
|
||||
router = APIRouter(tags=["pages"])
|
||||
|
||||
TEMPLATES_DIR = Path(__file__).resolve().parent.parent / "templates"
|
||||
templates = Jinja2Templates(directory=str(TEMPLATES_DIR))
|
||||
|
||||
|
||||
def _user_or_redirect(request: Request):
|
||||
"""Per le pagine, se non autenticato redirect al login. Ritorna user dict o RedirectResponse."""
|
||||
token = request.cookies.get("auth_token")
|
||||
auth = request.headers.get("authorization")
|
||||
if not token and auth and auth.startswith("Bearer "):
|
||||
token = auth[7:]
|
||||
user = _verify(token)
|
||||
if not user:
|
||||
target = str(request.url)
|
||||
return RedirectResponse(url=f"{settings.auth_login_url}?redirect={target}", status_code=302)
|
||||
return user
|
||||
|
||||
|
||||
def _render(request: Request, template: str, **ctx):
|
||||
user = _user_or_redirect(request)
|
||||
if isinstance(user, RedirectResponse):
|
||||
return user
|
||||
return templates.TemplateResponse(template, {"request": request, "user": user, **ctx})
|
||||
|
||||
|
||||
@router.get("/", response_class=HTMLResponse)
|
||||
async def home(request: Request):
|
||||
return RedirectResponse(url="/datasets")
|
||||
|
||||
|
||||
@router.get("/datasets", response_class=HTMLResponse)
|
||||
async def page_datasets(request: Request):
|
||||
return _render(request, "datasets.html", page="datasets")
|
||||
|
||||
|
||||
@router.get("/models", response_class=HTMLResponse)
|
||||
async def page_models(request: Request):
|
||||
return _render(request, "models.html", page="models")
|
||||
|
||||
|
||||
@router.get("/train", response_class=HTMLResponse)
|
||||
async def page_train(request: Request):
|
||||
return _render(request, "train.html", page="train")
|
||||
|
||||
|
||||
@router.get("/test", response_class=HTMLResponse)
|
||||
async def page_test(request: Request):
|
||||
return _render(request, "test.html", page="test")
|
||||
|
||||
|
||||
@router.get("/results", response_class=HTMLResponse)
|
||||
async def page_results(request: Request):
|
||||
return _render(request, "results.html", page="results")
|
||||
Reference in New Issue
Block a user