Una pagina web che carica un'immagine e mostra la classificazione restituita dall'API Python
fetch() in JavaScript per chiamare l'API creata nel Modulo 06Chiudiamo il cerchio del triennio: la pagina HTML/JS (frontend) invia un'immagine al server FastAPI (backend, Modulo 06), che la passa a un modello giร addestrato e restituisce la classe prevista.
fetchfrom fastapi import FastAPI, File, UploadFile
from fastapi.middleware.cors import CORSMiddleware
from PIL import Image
import numpy as np
import io
import pickle
app = FastAPI()
# Permette alla pagina web (origine diversa) di chiamare l'API
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
with open("modello_immagini.pkl", "rb") as f:
modello = pickle.load(f)
@app.post("/classifica")
async def classifica_immagine(file: UploadFile = File(...)):
contenuto = await file.read()
img = Image.open(io.BytesIO(contenuto)).convert("L").resize((28, 28))
array = np.array(img).reshape(1, -1) / 255.0
classe = modello.predict(array)[0]
return {"classe_prevista": str(classe)}CORSMiddleware.
<!DOCTYPE html>
<html lang="it">
<body>
<h1>Classificatore di Immagini</h1>
<input type="file" id="inputImmagine" accept="image/*">
<button onclick="classifica()">Classifica</button>
<p id="risultato"></p>
<script>
async function classifica() {
const input = document.getElementById("inputImmagine");
const risultatoEl = document.getElementById("risultato");
if (!input.files.length) {
risultatoEl.textContent = "Seleziona prima un'immagine.";
return;
}
const formData = new FormData();
formData.append("file", input.files[0]);
risultatoEl.textContent = "Classificazione in corso...";
try {
const risposta = await fetch("http://127.0.0.1:8000/classifica", {
method: "POST",
body: formData
});
const dati = await risposta.json();
risultatoEl.textContent = "Classe prevista: " + dati.classe_prevista;
} catch (errore) {
risultatoEl.textContent = "Errore: " + errore;
}
}
</script>
</body>
</html>Nota come fetch con FormData replichi, a livello browser, lo stesso schema richiesta/risposta visto con i socket in Quarta โ solo che ora client e server "parlano" HTTP e JSON in modo standard.
Questo modulo chiude il percorso tecnico del triennio: dati (Terza) โ modello (Quarta/Quinta) โ servizio di rete (socket, Quarta) โ API REST (Quinta) โ interfaccia web (questo modulo). Il Progetto Finale AI mette insieme tutti questi pezzi in un sistema unico, con MySQL a persistere dati e previsioni.
fetch e mostra il risultato.fetch() permette a una pagina JavaScript di chiamare un'API Python, inviando dati (anche file) e ricevendo una risposta JSON da mostrare dinamicamente. Con CORS abilitato sul backend, frontend e backend possono comunicare anche su origini diverse โ lo schema base di ogni applicazione web moderna basata su IA.