Come creare un API REST con Flask su Ubuntu

Introduzione

In questo tutorial, imparerete come creare un semplice API REST utilizzando Flask, un framework web leggero scritto in Python. Vedremo i fondamenti per impostare un’applicazione Flask, definire rotte, gestire richieste e restituire risposte JSON. By the end of this tutorial, you will have a working API that you can extend and integrate with other applications.

Prerequisiti

  • Un server in esecuzione su Ubuntu e un utente non amministratore con diritti sudo e un firewall attivo. Per istruzioni su come impostare questo setup, scegliete la vostra distribuzione da questo elenco e seguite la nostra guida di configurazione iniziale del server. Assicuratevi di lavorare con una versione supportata di Ubuntu.

  • Conoscenza della riga di comando di Linux. Per un approcio o un aggiornamento alla riga di comando, puoi visitare questo guide sulla primavera di Linux

  • Un’introduzione di base alla programmazione in Python.

  • Python 3.7 o successivo installato sul tuo sistema Ubuntu. Per imparare come eseguire un script Python su Ubuntu, puoi fare riferimento al nostro tutorial sulla Come eseguire un script Python su Ubuntu.

Step 1 — Setting Up Your Flask Environment

Ubuntu 24.04 include Python 3 come default. Apri il terminale e esegui il seguente comando per controllare la installazione di Python 3:

root@ubuntu:~# python3 --version
Python 3.12.3

Se Python 3 è già installato sulla tua macchina, il comando precedente restituirà la versione corrente dell’installazione di Python 3. In caso contrario, puoi eseguire il seguente comando per installare Python 3:

root@ubuntu:~# sudo apt install python3

Successivamente, devi installare il package installer pip sul tuo sistema:

root@ubuntu:~# sudo apt install python3-pip

Una volta installato pip, installiamo Flask.

Installeremo Flask tramite pip. È consigliato fare questo in un ambiente virtuale per evitare conflitti con altri pacchetti sul tuo sistema.

root@ubuntu:~# python3 -m venv myprojectenv
root@ubuntu:~# source myprojectenv/bin/activate
root@ubuntu:~# pip install Flask

Step 2 – Creare un’applicazione Flask

La prossima step è scrivere il codice Python per l’applicazione Flask. Per creare un nuovo script, navigare nella directory di tuo gradimento:

root@ubuntu:~# cd ~/path-to-your-script-directory

Una volta nella directory, creare un nuovo file Python, app.py, e importare Flask. Poi, inizializzare un’applicazione Flask e creare una rotta base.

root@ubuntu:~# nano app.py

Ciò aprirà un editor di testo iniziale. Scrivi il tuo logica qui o copia il seguente codice:

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# In-memory data store
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

Step 3 — Creazione di rotte RESTful

In questa sezione, definiremo rotte nella nostra applicazione Flask che corrispondono agli azioni differenti che un utente può eseguire sull’API. Ogni rotta gestirà un metodo HTTP specifico.

GET, POST, PUT, e DELETE. Questi metodi corrispondono alle quattro operazioni base di memoria persistente – spesso chiamate CRUD (Create, Read, Update, Delete).

Aggiungi le seguenti rotte al tuo script Python app.py:

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# In-memory data store
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

# GET request: Retrieve all items
@app.route('/api/items', methods=['GET'])
def get_items():
    return jsonify(items)

# GET request: Retrieve a specific item by ID
@app.route('/api/items/<int:item_id>', methods=['GET'])
def get_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    return jsonify(item)

# POST request: Create a new item
@app.route('/api/items', methods=['POST'])
def create_item():
    new_item = {"id": len(items) + 1, "name": request.json.get('name')}
    items.append(new_item)
    return jsonify(new_item), 201

# PUT request: Update an existing item
@app.route('/api/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    item['name'] = request.json.get('name', item['name'])
    return jsonify(item)

# DELETE request: Delete an item
@app.route('/api/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    global items
    items = [item for item in items if item["id"] != item_id]
    return '', 204

if __name__ == "__main__":
    app.run(debug=True)

Scopriamo di più sulle funzioni di ogni operazione:

  • Import Flask: Il codice importa i componenti necessari da Flask: Flask, jsonify, e request.

  • Data Store in Memoria: items è una semplice lista di dizionari che funge da data store temporaneo per l’API. Ogni elemento ha un id e un name.

  • GET /api/items: Quando viene effettuata una richiesta GET a /api/items, il server restituisce un elenco di tutti gli elementi nel data store degli items. Questo è utile per recuperare tutte le risorse in una collezione.

  • POST /api/items: Una richiesta POST a /api/items consente al client di creare un nuovo elemento. Il server si aspetta un oggetto JSON contenente i dettagli del nuovo elemento nel corpo della richiesta. Dopo aver creato l’elemento, il server risponde con l’elemento appena creato e un codice di stato 201 Created.

  • PUT /api/items/<int:item_id>: Una richiesta PUT a /api/items/<item_id> viene utilizzata per aggiornare un elemento esistente con l’item_id specificato. Il client invia i dati aggiornati nel corpo della richiesta, e il server modifica l’elemento esistente. Se l’elemento non viene trovato, il server restituisce un errore 404 Not Found.

  • DELETE /api/items/<int:item_id>: Una richiesta DELETE a /api/items/<item_id> rimuove l’elemento con l’item_id specificato dal deposito dati. Se l’elemento viene eliminato con successo, il server risponde con un codice di stato 204 No Content, indicando che l’eliminazione è avvenuta con successo e che non c’è ulteriore contenuto da restituire.

  • Running the Application: Il blocco if __name__ == "__main__": garantisce che l’applicazione Flask venga eseguita quando lo script viene eseguito direttamente.

Passo 4 — Avvio e Test dell’API

Avviare il server Flask utilizzando il seguente comando:

root@ubuntu:~# python3 app.py

Dovresti notare il server Flask in esecuzione con l’output seguente:

Output
* Serving Flask app 'app' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 837-877-972

Dall’output precedente puoi notare che il server è in esecuzione su http://127.0.0.1 e ascolta sulla porta 5000.

Ora, puoi testare gli endpoint usando curl, Postman, o un altro client HTTP. In questo tutorial userai curl per testare gli endpoint e inviare richieste HTTP.

Apri un’altra console Ubuntu e esegui i comandi curl seguenti uno dopo l’altro:

  • GET: curl http://127.0.0.1:5000/api/items
  • POST: curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
  • PUT: curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
  • DELETE: curl -X DELETE http://127.0.0.1:5000/api/items/1

Ora, vediamo in azione ognuno di questi comandi:

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 1, "name": "This is item 1" }, { "id": 2, "name": "This is item 2" } ]

Notare che il server restituisce una lista di tutti gli elementi nel database degli item.

Utilizzando il metodo POST, aggiungeremo un nuovo elemento al data store.

root@ubuntu:~# curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
Output
{ "id": 3, "name": "This is item 3" }

Nota: Sul tuo altro console dove il tuo server Flask è in esecuzione, noterai tutte le richieste HTTP in esecuzione e i loro codici di risposta anche.

* Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 837-877-972
127.0.0.1 - - [23/Aug/2024 06:57:27] "GET /api/items HTTP/1.1" 200 -
127.0.0.1 - - [23/Aug/2024 06:59:56] "POST /api/items HTTP/1.1" 201 -

Questa è una grande maniera per monitorare, debug e risolvere problemi con il server.

Prossimamente, eseguiamo una richiesta PUT. Una richiesta PUT a /api/items/<item_id> aggiornerà l’elemento esistente con l’item_id specificato.

root@ubuntu:~# curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

Ora, eseguiamo una richiesta GET per vedere l’elemento aggiornato 1.

root@ubuntu:~# curl http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

Alla fine, eseguiamo una richiesta DELETE per eliminare un elemento dal data store.

root@ubuntu:~# curl -X DELETE http://127.0.0.1:5000/api/items/1

Questo eliminerà l’elemento 1 dal data store.

Per verificare questo, eseguiamo una richiesta GET.

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 2, "name": "This is item 2" }, { "id": 3, "name": "This is item 3" } ]

Notare che l’elemento 1 non è più presente e è stato cancellato definitivamente.

Conclusione

In questo tutorial, hai creato una semplice app REST con Flask. Ora puoi estendere questa API con route aggiuntive, integrare una base dati o deployarla su una piattaforma cloud come DigitalOcean. Flask è una potente piattaforma per la creazione di API veloci e efficienti, e con questi principi base, sei pronto a iniziare a costruire applicazioni più complesse.

Source:
https://www.digitalocean.com/community/tutorials/create-a-rest-api-using-flask-on-ubuntu