YouTalent® – Comunità online di talenti

Creazione di API per servire modelli di machine learning con Flask o FastAPI

Flask e FastAPI dominano il mondo delle API per machine learning perché rendono tutto più semplice. Questi framework Python trasformano i tuoi modelli scikit-learn o lightgbm in servizi web pronti all’uso, senza il mal di testa che ti daresti con soluzioni più complesse come Django Rest Framework.

Flask funziona come un micro framework perfetto per progetti piccoli, mentre FastAPI brilla quando hai bisogno di velocità e operazioni asincrone con async/await.

FastAPI è caratterizzato da alta usabilità e velocità, con documentazione ricca e dettagliata.

La scelta tra questi due dipende dalle tue esigenze specifiche. FastAPI supporta automaticamente OpenAPI e Swagger, creando documentazione interattiva che fa sorridere anche i backend developer più esigenti.

Le API restituiscono dati in JSON o XML, e tu puoi servire tutto dal California Housing Dataset alle predizioni più complesse. Flask resta la scelta sicura per applicazioni semplici, ma FastAPI ti offre quella marcia in più quando lavori con pipeline di machine learning intensive e hai bisogno di scalabilità enterprise.

Addestramento e salvataggio del modello

Il tuo modello di machine learning ha bisogno di addestramento prima di servire le predizioni tramite API. Devi salvare il modello addestrato per utilizzarlo successivamente nelle tue applicazioni web.

  1. Apri Jupyter Notebook e importa le librerie necessarie: numpy, pandas, LightGBM e sklearn per il tuo progetto di data science.
  2. Carica il California housing dataset di sklearn per addestrare il tuo modello predittivo con dati reali.
  3. Dividi i dati in set di training e test utilizzando train_test_split per valutare correttamente le prestazioni.
  4. Addestra il modello LightGBM sui dati di training senza preoccuparti dell’ottimizzazione in questa fase.
  5. Valuta il modello calcolando Mean Squared Error (MSE) e Root Mean Squared Error (RMSE), che dovrebbe risultare 0.81.
  6. Crea la funzione medinc_regressor(x: dict) che restituisce un dizionario con la chiave “prediction” per le future chiamate API.
  7. Salva il modello addestrato come file pickle utilizzando la libreria pickle di Python per l’uso futuro.
  8. Testa il caricamento del modello salvato per assicurarti che funzioni correttamente prima della distribuzione.
  9. Verifica che il modello salvato generi predizioni accurate sui nuovi dati di test.

Ora che hai il modello addestrato e salvato, puoi procedere con la creazione dell’API utilizzando i framework web.

Creazione di un’API con Flask

Flask ti permette di creare API semplici e potenti per i tuoi modelli di machine learning… è come costruire un ponte tra il tuo codice Python e il mondo esterno. Con pochi comandi, puoi trasformare il tuo DecisionTreeClassifier (o qualsiasi altro algoritmo) in un servizio web che risponde alle richieste HTTP, rendendo le tue predizioni accessibili da qualsiasi applicazione.

Creazione degli endpoint API

Quando progetti la tua API per servire modelli di machine learning, devi creare endpoint specifici che gestiscano le richieste e restituiscano predizioni accurate. Ogni endpoint rappresenta un punto di accesso che permette ai client di comunicare con il tuo modello attraverso il protocollo rest api.

  • Definisci la rotta principale con @app.route(‘/api/v1/resources/albums/all’) per creare un endpoint che visualizza tutti gli album nel database del tuo sistema
  • Implementa l’endpoint per filtrare i dati usando @app.route(‘/api/v1/resources/albums’, methods=[‘GET’]) che permette ai client di accedere alle funzionalità di ricerca
  • Configura parametri di query multipli come id, artista, album e genere per permettere filtri dinamici nelle tue richieste web api
  • Costruisci la logica che crea query SQL dinamiche basate sui parametri forniti dall’utente nelle chiamate al tuo endpoint
  • Inizializza la query con query=’SELECT * FROM album WHERE’ per stabilire la base della tua ricerca nel database degli album
  • Implementa la funzione “api_filter()” che descrive gli oggetti disponibili nella data attuale includendo id_key, artist, album, genre
  • Pulisci la query SQL finale rimuovendo l’”AND” in eccesso e aggiungendo un punto e virgola per garantire sintassi corretta
  • Gestisci le richieste HTTP GET per permettere ai client di recuperare predizioni dal tuo modello di machine learning
  • Configura la restituzione dei dati in formato JSON per garantire compatibilità con diversi tipi di client e applicazioni
  • Implementa la gestione degli errori per restituire messaggi informativi quando le richieste contengono parametri non validi
  • Esegui l’applicazione con if name == ‘main‘: app.run(use_reloader=False) per avviare il server in modalità principale
  • Valida i dati in ingresso prima di processarli per evitare errori durante l’elaborazione delle predizioni del modello
  • Struttura le risposte con codici di stato HTTP appropriati per comunicare chiaramente il risultato delle operazioni ai client

Gestione delle richieste e restituzione delle predizioni

La gestione delle richieste rappresenta il cuore del tuo sistema API. Devi estrarre le caratteristiche di input dal payload JSON della richiesta che arriva dal client. Queste caratteristiche vengono poi convertite in un array numpy per permettere al modello di elaborarle correttamente.

Il processo richiede attenzione ai dettagli, specialmente quando lavori con dati complessi o strutture annidate nel JSON.

Una volta processati i dati, il modello genera le sue previsioni attraverso algoritmi di regressione o altre tecniche di machine learning. Le previsioni sono restituite come risposta JSON all’utente, mantenendo un formato standardizzato e facilmente interpretabile.

Puoi testare questo flusso utilizzando Postman per inviare richieste POST con le caratteristiche di input specifiche del tuo caso d’uso.

La connessione al database SQLite viene stabilita ad ogni richiesta per garantire l’accesso ai dati aggiornati. La funzione “api_all()” si connette tramite sqlite3.connect(DB) e utilizza cur=conn.cursor() per iniziare un cursore.

I risultati vengono recuperati dal database e restituiti come oggetto JSON strutturato. Per esempio, testando l’API con una richiesta agli album della band Sepultura all’URL http://127.0.0.1:5000/api/v1/resources/albums?artist=Sepultura, otterrai una risposta JSON completa con tutti i dati richiesti.

Creazione di un’API con FastAPI

FastAPI changes how you build machine learning APIs… it’s faster, cleaner, and honestly more fun than traditional frameworks. You’ll love how Sebastián Ramírez designed this framework with modern Python features, automatic documentation, and built-in support for asynchronous operations that make your models fly.

Utilizzo di Pydantic per la validazione dei dati

Ora che hai configurato FastAPI, devi creare una classe Pydantic per gestire il modello dati del feature set. Una classe Pydantic è necessaria per gestire il modello dati del feature set, estendendo BaseModel.

La classe FeatureSet definisce i seguenti attributi come float: HouseAge, AveRooms, AveBedrms, Population, AveOccup, Latitude, Longitude. Questa struttura ti permette di definire esattamente quali dati il tuo endpoint deve ricevere.

FastAPI utilizza Pydantic per la validazione automatica dei dati. La validazione dei dati di input è integrata tramite type hints e Pydantic. Ogni volta che ricevi una richiesta, il sistema controlla automaticamente se i dati corrispondono al formato richiesto.

Pydantic migliora la sicurezza e l’affidabilità degli endpoint, eliminando errori comuni di programmazione. La struttura dei dati di input è rigorosamente definita tramite classi Pydantic.

Un errore di validazione viene restituito automaticamente se i dati di input non corrispondono allo schema. La documentazione degli endpoint mostra automaticamente il formato dei dati di input.

Questo significa che altri sviluppatori possono vedere subito quali parametri servono per usare la tua API. Il processo di validazione funziona dietro le quinte, senza che tu debba scrivere codice extra per controllare ogni singolo valore.

Creazione di endpoint asincroni per predizioni veloci

Dopo aver validato i dati con Pydantic, puoi creare endpoint che gestiscono più richieste contemporaneamente. FastAPI supporta operazioni I/O-bound ad alte prestazioni attraverso funzioni asincrone.

  • Definisci endpoint con decoratore @app.post("/predict") per ricevere dati via POST e restituire predizioni rapide
  • Aggiungi async def prima del nome della funzione per abilitare l’esecuzione asincrona con async/await
  • Utilizza await quando carichi il modello o esegui operazioni che richiedono tempo di elaborazione
  • Configura uvicorn come server ASGI per gestire connessioni concorrenti senza compromettere le prestazioni
  • Implementa la funzione ml_lifespan_manager(app: FastAPI) per caricare modelli prima che l’app riceva richieste
  • Crea un dizionario ml_models globale per gestire diversi modelli di machine learning in memoria
  • Evita il caricamento del modello per ogni singola richiesta utilizzando il context manager asincrono
  • Sfrutta l’iniezione di dipendenze per migliorare la modularità degli endpoint e separare la logica
  • Gestisci il caricamento e la pulizia delle risorse attraverso context manager che ottimizzano l’uso della memoria
  • FastAPI è progettato per gestire molte connessioni simultanee mantenendo velocità elevate di risposta
  • Combina tensorflow.js con FastAPI per creare soluzioni full-stack che processano dati in tempo reale
  • Integra servizi cloud come google vision o ibm watson negli endpoint asincroni per funzionalità avanzate

Confronto tra Flask e FastAPI

When you’re deciding between Flask and FastAPI for your machine learning API, you’ll find yourself weighing speed against simplicity… and honestly, both frameworks have their sweet spots that might surprise you.

Prestazioni e scalabilità

Le prestazioni determinano il successo della tua API di machine learning, e la scelta del framework influisce drasticamente sui risultati.

Aspetto Flask FastAPI
Richieste al secondo 4.000-5.000 richieste Oltre 20.000 richieste
Supporto asincrono Limitato Nativo e ottimizzato
Connessioni concorrenti Ridotte Molte senza perdita prestazioni
Scalabilità progetti Piccole applicazioni Microservizi e ML enterprise
Docker performance boost Standard +60% scalabilità sistema
Tempo risposta con Docker Miglioramento base -40% tempo risposta
Gestione carico Limitazioni evidenti Alta capacità elaborazione
Uso memoria Maggiore consumo Ottimizzazione avanzata

FastAPI domina chiaramente nelle prestazioni pure. La differenza tra 4.000 e oltre 20.000 richieste al secondo rappresenta un gap enorme per applicazioni critiche. Flask mostra i suoi limiti proprio nella gestione del traffico intenso, mentre FastAPI eccelle grazie al supporto asincrono nativo.

La scalabilità diventa cruciale per progetti di machine learning complessi. Flask funziona bene per prototipi e piccole applicazioni, ma incontra difficoltà con carichi pesanti. FastAPI gestisce molte connessioni concorrenti senza compromettere le prestazioni, rendendolo ideale per servizi ML enterprise.

Docker amplifica ulteriormente le capacità di FastAPI. L’aumento del 60% della scalabilità del sistema rappresenta un vantaggio competitivo significativo. La riduzione del 40% del tempo di risposta delle API migliora drasticamente l’esperienza utente finale.

Microservizi di machine learning richiedono framework robusti e performanti. FastAPI soddisfa questi requisiti meglio di Flask, specialmente in ambienti cloud dove la scalabilità automatica è essenziale. La gestione efficiente della memoria contribuisce a ridurre i costi operativi complessivi.

Facilità di implementazione

Quando devi scegliere tra Flask e FastAPI per il tuo primo progetto di machine learning, la facilità di implementazione diventa un fattore cruciale.

Aspetto Flask FastAPI
Curva di apprendimento Molto semplice, ideale per principianti Richiede conoscenza di type hints e Pydantic
Configurazione iniziale Minimale, puoi iniziare subito Necessita di maggiore configurazione iniziale
Prototipazione rapida Perfetto per piccoli servizi veloci Più strutturato, meno immediato
Struttura del progetto Favorisce applicazioni in un solo file per piccoli progetti Incoraggia strutture più complesse fin dall’inizio
Validazione dati Richiede strumenti aggiuntivi per input validation Automatizza validazione e documentazione nativamente
Documentazione API Devi aggiungere librerie esterne Integrazione documentazione automatica nativa
Tempo di sviluppo Velocissimo per MVP e demo Investimento iniziale maggiore, vantaggi a lungo termine

Flask ti permette di creare un endpoint funzionante in pochissime righe. Basta importare la libreria, definire una rotta, caricare il modello. Fatto! Puoi servire predizioni in meno di 20 righe di codice.

FastAPI richiede più preparazione iniziale. Devi definire modelli Pydantic per input e output. Serve configurare la documentazione automatica. Gli type hints sono obbligatori per sfruttare le funzionalità avanzate.

Per progetti semplici o proof of concept, Flask vince a mani basse. La sua natura minimalista elimina complessità inutili. Puoi concentrarti sul modello invece che sulla configurazione del framework.

Tuttavia, FastAPI ripaga l’investimento iniziale con automazioni potenti. Validazione automatica degli input, documentazione interattiva, gestione errori avanzata. Tutto incluso “out of the box”.

Se stai imparando o hai fretta, Flask è la scelta ovvia. Popolare tra sviluppatori di ogni livello, offre flessibilità totale. Puoi aggiungere funzionalità man mano che il progetto cresce.

FastAPI brilla quando progetti applicazioni robuste fin dall’inizio. Automatizza molte attività noiose, ma richiede familiarità con Python moderno. Type hints e async/await non sono opzionali.

Supporto per funzionalità avanzate

Quando sviluppi API per machine learning, le funzionalità avanzate fanno la differenza tra un servizio base e una soluzione professionale.

Funzionalità Flask FastAPI
Documentazione automatica Richiede librerie esterne come Flask-RESTX Genera automaticamente Swagger UI e ReDoc
Validazione dati Nessun strumento nativo per validazione automatica Utilizza Pydantic per validazione automatica
Type hints Supporto limitato, non integrato Type hints nativi con Pydantic
Programmazione asincrona Non supporta nativamente funzioni async Supporta programmazione asincrona completa
Iniezione dipendenze Configurazione manuale richiesta Sistema integrato per dependency injection
Endpoint asincroni Limitazioni significative per I/O-bound Ideali per carichi di lavoro I/O-bound
Modularità Blueprint system disponibile Facilita modularità degli endpoint
Scalabilità servizi Configurazione complessa per servizi avanzati Gestisce facilmente servizi complessi e scalabili

FastAPI eccelle nella documentazione automatica. Genera Swagger UI senza configurazione extra. ReDoc appare automaticamente per ogni progetto. Flask richiede estensioni separate per ottenere risultati simili.

Pydantic trasforma la validazione dati in FastAPI. Type hints definiscono automaticamente la struttura. Errori di validazione vengono gestiti senza codice aggiuntivo. Flask non include strumenti nativi per questa funzionalità.

Dependency injection semplifica l’architettura in FastAPI. Database connections, autenticazione, logging si integrano naturalmente. Flask necessita configurazione manuale per ogni dipendenza.

Endpoint asincroni offrono vantaggi enormi per I/O operations. FastAPI supporta async/await in modo nativo. Chiamate al database, API esterne, file operations diventano non-bloccanti. Flask non supporta nativamente la programmazione asincrona.

Modularità degli endpoint facilita progetti grandi. FastAPI organizza router in modo intuitivo. Microservizi si sviluppano con meno complessità. Servizi complessi mantengono struttura pulita.

Ora esaminiamo come queste differenze si traducono in prestazioni concrete e facilità di implementazione.

Distribuzione del modello e dell’API

Dopo aver creato la tua API con Flask o FastAPI, devi renderla disponibile al mondo… e qui inizia la vera sfida! Puoi usare Docker per “impacchettare” tutto il tuo lavoro (modello, codice, dipendenze) in un container che funziona ovunque, oppure sfruttare i servizi cloud come AWS o Microsoft Azure per ospitare la tua creazione.

Utilizzo di Docker per la containerizzazione

Docker trasforma il modo in cui distribuisci i tuoi modelli di machine learning. Containerizzare le tue API con Flask o FastAPI diventa semplice e veloce.

  1. Crei un Dockerfile nella cartella del tuo progetto per definire l’ambiente di esecuzione. Il file specifica tutte le dipendenze necessarie per far funzionare il modello.
  2. Installi Docker sul tuo sistema operativo e verifichi che funzioni correttamente. Puoi usare anaconda per gestire le librerie Python dentro il container.
  3. Costruisci l’immagine Docker con il comando “docker build” dalla directory del progetto. L’immagine contiene tutto il codice e le dipendenze.
  4. Riduci il tempo di risposta delle API del 40% grazie alla containerizzazione. Docker ottimizza le prestazioni del sistema in modo significativo.
  5. Aumenti la scalabilità del sistema del 60% usando Docker per distribuire i modelli. La tecnologia permette di gestire più richieste contemporaneamente.
  6. Configuri il Dockerfile per il deployment automatico su diversi host cloud. Microsoft Azure, AWS e Google Cloud supportano tutti i container Docker.
  7. Gestisci facilmente le dipendenze e gli ambienti runtime con Docker. Non devi preoccuparti di conflitti tra librerie o versioni diverse.
  8. Garantisci la portabilità tra ambienti di sviluppo e produzione usando container. Il modello funziona allo stesso modo ovunque lo distribuisci.
  9. Integri Docker con FastAPI per creare servizi scalabili e veloci. Starlette fornisce il supporto asincrono necessario per le prestazioni ottimali.
  10. Distribuisci il container su piattaforme cloud con pochi comandi. Docker semplifica il processo di deployment e riduce gli errori.
  11. Monitori le prestazioni del container usando strumenti di logging integrati. Puoi tracciare l’utilizzo delle risorse e ottimizzare il sistema.
  12. Crei pipeline di CI/CD che costruiscono automaticamente nuove immagini Docker. Il processo diventa completamente automatizzato e affidabile.

Opzioni di distribuzione su cloud (AWS, Azure, Google Cloud)

I principali partner cloud supportano la pianificazione attiva del proof-of-concept per le tue API di machine learning. Puoi scegliere tra AWS, Azure e Google Cloud per distribuire i tuoi modelli con scalabilità globale.

  1. Amazon Web Services (AWS) offre EC2 per hosting e Lambda per funzioni serverless che gestiscono le tue predizioni automaticamente.
  2. Microsoft Azure fornisce App Service e Container Instances che semplificano il deployment delle tue API Flask o FastAPI.
  3. Google Cloud Platform include Compute Engine e Cloud Run per eseguire i tuoi modelli con bilanciamento del carico automatico.
  4. La scelta del cloud provider dipende da costi, domanda e requisiti di progetto specifici per la tua applicazione.
  5. Tutti i provider supportano l’integrazione con containerizzazione per semplificare il processo di deployment delle API.
  6. I servizi cloud permettono la gestione automatica del bilanciamento del carico durante picchi di traffico imprevisti.
  7. Il deployment su cloud richiede configurazione di sicurezza e gestione delle risorse per proteggere i tuoi dati sensibili.
  8. La distribuzione su cloud consente il monitoraggio centralizzato delle API attraverso dashboard integrate e metriche dettagliate.
  9. Puoi utilizzare replit per testare rapidamente le configurazioni prima del deployment finale su cloud.
  10. I provider cloud offrono accesso globale ai tuoi modelli attraverso data center distribuiti in tutto il mondo.

Ora esploriamo le migliori pratiche per sviluppare API sicure e performanti per i tuoi modelli di machine learning.

Migliori pratiche nello sviluppo di API per modelli di machine learning

Developing machine learning APIs requires careful planning and smart choices that keep your models running smoothly. You need to think about version control, security measures, and monitoring systems that protect your data while delivering fast, reliable predictions to users.

Versionamento delle API

Il versionamento delle API rappresenta una strategia fondamentale per mantenere la stabilità del tuo servizio. Devi includere il numero di versione direttamente nell’URL, come `/api/v1/resources/albums/all`, per garantire chiarezza e organizzazione.

Questa pratica permette la coesistenza di più versioni dell’API simultaneamente, offrendo flessibilità sia a te che ai tuoi utenti.

La retrocompatibilità diventa automatica quando implementi correttamente il versionamento. Puoi aggiungere nuove funzionalità senza rompere la compatibilità esistente, mentre l’aggiornamento delle versioni si gestisce tramite routing differenziato.

Il versionamento semplifica notevolmente la manutenzione di API distribuite su larga scala e aiuta nella gestione delle dipendenze lato client. Le best practice suggeriscono sempre di seguire questo approccio per evitare problemi futuri con i tuoi servizi di machine learning.

Sicurezza e protezione dei dati

Dopo aver stabilito un sistema di versioni per le tue API, devi concentrarti sulla sicurezza dei dati. L’autenticazione e l’autorizzazione degli endpoint proteggono i tuoi modelli da accessi non autorizzati.

Puoi implementare token di accesso o chiavi API per controllare chi usa i tuoi servizi. La validazione rigorosa dei dati di input riduce i rischi di injection e altre vulnerabilità comuni.

HTTPS protegge sempre la trasmissione dei dati sensibili tra client e server.

I log di accesso permettono il monitoraggio di tentativi sospetti e comportamenti anomali. L’isolamento tramite container o ambienti virtuali aumenta significativamente la sicurezza del sistema.

Il controllo degli accessi limita l’uso dell’API solo agli utenti autorizzati e verificati. Configura sempre firewall e sistemi di monitoraggio per detectare attacchi in tempo reale.

La crittografia dei dati a riposo protegge le informazioni sensibili memorizzate nei database.

Test e monitoraggio delle API

Testare e monitorare le tue API per machine learning ti aiuta a trovare problemi prima che diventino gravi. Questo processo garantisce che il tuo servizio funzioni sempre bene e risponda velocemente agli utenti.

  1. Usa Postman per testare tutti i tuoi endpoint API e verificare che le risposte siano corrette.
  2. Configura il logging delle richieste per analizzare le performance e identificare i colli di bottiglia del sistema.
  3. Implementa il monitoraggio continuo delle API per rilevare errori e tempi di risposta elevati in tempo reale.
  4. Verifica la connessione al database ad ogni richiesta per assicurare che i dati siano sempre aggiornati.
  5. Crea test automatizzati che controllano regolarmente la robustezza del tuo servizio di machine learning.
  6. Monitora le metriche di utilizzo per pianificare la scalabilità proattiva del sistema quando necessario.
  7. Gestisci gli errori con pagine 404 personalizzate per migliorare l’esperienza utente finale.
  8. Integra strumenti di monitoraggio con servizi cloud per ricevere alerting automatico sui problemi critici.
  9. Testa le API con diversi volumi di traffico per capire i limiti di performance.
  10. Controlla i tempi di risposta delle predizioni per garantire che siano accettabili per gli utenti.
  11. Monitora l’uso della memoria e CPU durante le operazioni di machine learning intensive.
  12. Configura dashboard per visualizzare le metriche chiave in tempo reale e identificare trend problematici.

Conclusioni

Ora hai gli strumenti per creare API potenti che servono modelli di machine learning. FastAPI offre velocità e documentazione automatica, mentre Flask garantisce semplicità e flessibilità per progetti più piccoli.

Pydantic valida i tuoi dati in modo efficace, e LightGBM gestisce predizioni veloci su dataset tabellari. Docker containerizza le tue applicazioni per deployment semplici su cloud come AWS o Google Cloud.

Inizia oggi stesso con il California housing dataset, sperimenta con uvicorn per servire la tua API, e scopri quanto sia facile trasformare modelli pickle in servizi web funzionanti.

Le tue competenze in machine learning meritano API professionali che le valorizzino al massimo.

Domande Frequenti

1. Posso usare Node.js insieme a Flask per creare API di machine learning?

Beh, tecnicamente potresti… ma sarebbe come mescolare olio e acqua (non il massimo della vita). Flask è Python, Node.js è JavaScript, quindi meglio scegliere uno dei due per evitare complicazioni inutili.

2. Come integro l’HTML nelle mie API per modelli di machine learning?

L’HTML serve principalmente per creare interfacce web semplici che comunicano con le tue API. Puoi costruire form basic che inviano dati ai tuoi endpoint Flask o FastAPI, niente di troppo complicato.

3. Dialogflow può funzionare con le API che creo per i miei modelli?

Assolutamente sì! Dialogflow può chiamare le tue API tramite webhook, permettendo ai tuoi chatbot di usare i modelli di machine learning. È una combo vincente per applicazioni conversazionali intelligenti.

4. Il Cognitive Toolkit Microsoft si integra bene con Flask e FastAPI?

Certo che sì. Puoi caricare i tuoi modelli addestrati con Cognitive Toolkit e servirli tramite endpoint REST… è abbastanza standard nel mondo del machine learning, nulla di rivoluzionario ma funziona benissimo.

Riferimenti

  1. https://www.diariodiunanalista.it/posts/servire-modelli-di-machine-learning-con-fastapi/ (2023-08-16)
  2. https://blog.devgenius.io/building-a-machine-learning-api-with-flask-42876b4f0076 (2023-05-12)
  3. https://www.glukhov.org/it/post/2025/11/api-in-python-with-fastapi/
  4. https://www.codecademy.com/article/fastapi-vs-flask-key-differences-performance-and-use-cases
  5. http://wosjournals.com/index.php/ptj/article/view/1919
  6. https://www.mergerscorp.it/businesses-for-sale/