Come nella lezione precedente anche in questo caso viene impostato un database MongoDB in locale in cui viene creata la collection users in cui inserire alcuni utenti fittizi.

Figura 1. Creazione di un'applicazione REST con Flask
Rispetto al primo esempio però, come si può, immaginare viene impostato un assetto del tutto diverso. Intanto parliamo di un'implementazione Python quindi la libreria fondamentale per l'interazione con Mongo sarà pymongo. Inoltre, non si parla di un semplice script, bensì di un servizio REST che ha bisogno quindi di Flask. Il tutto sintetizzato nel classico file requirements.txt dal contenuto:
pip
Flask==3.1.2
pymongo
Flask-PyMongo
Il database di prova dovrebbe essere già operativo e per verificarlo possiamo farci aiutare da Gemini con il prompt "come possiamo provare che il database Mongo sia in esecuzione?".
L'Intelligenza Artificiale fa una cosa interessante. Ci suggerisce il comando ps aux | grep mongod per vedere se il comando è in esecuzione e ci offre un pulsante per eseguirlo. Se lo clicchiamo viene eseguito il codice nel terminale e viene poi riletto da Gemini stesso che nella chat del prompt lo descrive e ci specifica perché l'output visualizzato dimostra che il server del database è in esecuzione.
Il progetto si basa essenzialmente su un unico file, app.py, che include tutta la definizione dei metodi. Ve ne sono già descritti diversi ma invece di studiarli attraverso il codice possiamo usare il prompt della AI, sempre disponibile, anche ai fini documentali chiedendo "descrivi i metodi che queste API REST offrono". Il nostro assistente ci risponderà con una descrizione articolata indicando il metodo HTTP, l'endpoint ed il modo per utilizzarlo, ad esempio:
PUT /users/<user_id>: Aggiorna un utente esistente in base al suo ID.
I dati aggiornati dell'utente vengono inviati nel corpo della richiesta in formato JSON.
REST API con MongoDB: il metodo di prova
Possiamo a questo punto chiedere un metodo di prova. Sarebbe sufficiente avere a disposizione un comando curl. Chiediamo nel prompt "Inseriamo un utente nella collection users con una richiesta POST via curl" ed otteniamo sia l'indicazione del comando da eseguire:
curl -X POST -H "Content-Type: application/json" -d '{
"name": "Mario Rossi",
"email": "mario.rossi@example.com",
"age": 30
}' http://127.0.0.1:5000/users
sia il pulsante corredato per l'esecuzione diretta. Dopo aver eseguito il comando otteniamo una doppia risposta:
- nel terminale abbiamo la vera risposta di curl sia con le metriche di funzionamento del comando sia il messaggio di output in formato JSON:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 100 123 100 39 100 84 1715 3694 --:--:-- --:--:-- --:--:-- 5590 {"message": "User added successfully!"} - nel prompt Gemini interpreta l'output prodotto nel terminale e ce ne dà il significato dicendo che la creazione del nuovo utente è avvenuta ed ora siamo pronti per fare una GET e vedere i dati inseriti.
Avere questa doppia risposta è particolarmente utile nel nostro lavoro sulle REST API con MongoDB perché non obbliga ad utilizzare il terminale ma anche questo, come il codice, può essere utilizzato indirettamente grazie al prompt di Intelligenza Artificiale che diventa il vero volano dell'ambiente di lavoro.
Verifica della creazione dell'utente
Per verificare se l'utente è stato davvero creato abbiamo due vie: passare dalle API con una GET via curl o interrogare direttamente il database mediante il comando shell mongosh. Nella normalità, probabilmente, faremmo una prova con l'uno o con l'altro o magari entrambi confrontando i risultati. Visto che abbiamo l'Intelligenza Artificiale a disposizione incarichiamo l'assistente di fare entrambe le prove per noi e metterle a confronto. Usiamo questo prompt:
Verifichiamo se l'utente esiste in due modi: prima facciamo una query sul database con mongosh e poi una richiesta GET alle API. Confronta i risultati e dimmi se entrambi dimostrano l'esistenza degli stessi dati
La risposta è assolutamente pregnante a quello che abbiamo richiesto. Viene offerta suddivisa in due parti. Nella prima viene proposto il comando mongosh my_database --eval "db.users.find()" per eseguire una query direttamente sul database ma viene eseguita solo al click del pulsante di esecuzione. La seconda parte offre un'interrogazione delle API con curl http://127.0.0.1:5000/users. Infine, comprendendo che quello che ci interessa è un confronto, l'assistente offre anche delle conclusioni in cui scrive:
Sia la query diretta al database con mongosh che la richiesta GET all'API REST confermano l'esistenza dello stesso utente: Mario Rossi.
Proseguendo poi con ulteriori considerazione sul formato dei dati, la presenza dell'identificatore _id ed altri dettagli.
Creazione automatica di un nuovo metodo
Per fare quest'ultima prova, passiamo un ulteriore prompt:
crea un metodo DELETE che permette di svuotare l'intera collection users
L'AI ci risponde che prima rilegge il file app.py e poi ci propone una modifica che, una volta accettata, aggiunge questo metodo al codice:
@app.route('/users', methods=['DELETE'])
def delete_all_users():
result = collection.delete_many({})
return jsonify({"message": f"{result.deleted_count} users deleted successfully!"}), 200
Ci ricorda inoltre che il server Flask di sviluppo (già inserito originariamente nel progetto Firebase Studio con il file devserver.sh) deve essere riavviato per poter provare la funzionalità ma anche in questo caso ci viene offerto codice pkill -f devserver.sh && ./devserver.sh e pulsante di esecuzione.
REST API con MongoDB: ultima verifica
Facciamo fare l'ultima verifica chiedendo:
Prova il nuovo metodo (DELETE di tutta la collection users) facendo poi una GET per verificare che restituisca una lista vuota
L'AI di Firebase Studio predispone il suo piano in cui fa prima una DELETE con il nuovo metodo e poi una GET. Alla fine decreta: La richiesta GET ha restituito un array vuoto [], a conferma che la collection users è stata svuotata con successo.
Il nuovo endpoint DELETE /users funziona come previsto.
Abbiamo così scoperto come Firebase Studio sia perfettamente in grado di rispondere alle nostre necessità di lavorare a backend con MongoDB accompagnandoci in ogni tipo di task: sviluppo, test, comprensione.
Se vuoi aggiornamenti su Creare REST API con MongoDB inserisci la tua email nel box qui sotto: