Pubblicità

Realizzare API con Python e Flask

In questo tutorial vi mostrerò come realizzare API con Python e Flask in pochi semplici passi.

Realizzare API con Python e Flask
Foto di Emile Perron su Unsplash

Le API svolgono un ruolo fondamentale in Internet e nelle moderne infrastrutture informatiche.
API, che sta per Application Programming Interface, comprende un insieme di regole, protocolli e strumenti che consentono ai software di comunicare tra loro. Le API facilitano interazioni strutturate e predefinite tra due sistemi software, permettendo loro di scambiare informazioni o eseguire operazioni.

Considerate questo esempio:

Quando effettuate l’accesso al vostro account di un qualunque servizio, state utilizzando un’API.

Dopo aver inviato il modulo di accesso con il vostro nome utente e password, queste informazioni vengono rapidamente trasmesse a un server per la convalida. Il server verifica quindi le credenziali e invia una risposta, concedendo l’accesso in caso di convalida riuscita.

Esistono vari tipi di API e molteplici metodi per implementarle.

In questo tutorial, vi aiuterò a costruire API in Python con Flask, un framework web ampiamente utilizzato per sviluppare sia siti web che API. Nello specifico creeremo due tipi di API: GET e POST.

Se i concetti di GET e POST non vi sono chiari al momento, non preoccupatevi, ve ne parlerò in modo più approfondito tra poco.

Prima di iniziare però, magari potrebbe farti piacere seguirmi su Medium o LinkedIn, oltre a dare un’occhiata naturalmente al Blog Pulp Learning. Grazie:D

Indice dei contenuti:

  • Perché creare un’API con Python
  • Realizzare API con Python e Flask
  • API GET in Python usando Flask
  • API POST in Python usando Flask

Perché creare un’API con Python

Abbiamo discusso dell’importanza delle API nel contesto di Internet, ma non abbiamo ancora approfondito perché crearne una usando Python.

Python si distingue come un linguaggio di programmazione ampiamente riconosciuto e rinomato per la sua semplicità.

La sintassi di Python è chiara e leggibile, rendendolo ideale per sviluppare e mantenere diversi progetti software, inclusa la costruzione di API.

Inoltre, Python vanta una community estesa e altamente attiva, un fattore cruciale che contribuisce alla sua ampia adozione in vari progetti software.

Se vuoi approfondire Python, qui trovi la documentazione ufficiale.

Realizzare API con Python e Flask

Flask è un micro-framework progettato per sviluppare applicazioni web in Python. Incarna le caratteristiche di essere leggero, veloce, semplice e flessibile.

Sfruttare Flask permette la creazione di complesse applicazioni web, come le API.

Scritto in Python, Flask si basa sullo strumento WSGI, un sistema di protocollo per applicazioni web Python, e Jinja2, un motore di template basato su Python.

Uno degli attributi distintivi di Flask risiede nella sua semplicità e nelle ampie possibilità di personalizzazione. Con solo poche righe di codice, è possibile stabilire un endpoint API (ovvero l’URL che ospita l’API) e integrare senza problemi un template HTML.

Per approfondire, ti consiglio di visitare la documentazione ufficiale del progetto che trovi qui e la sua pagina GitHub.

Nelle sezioni seguenti vi guiderò attraverso la realizzazione sia di un’API GET che di un’API POST usando Python con Flask, il tutto in pochissime righe di codice!

Nota: prima di iniziare assicuratevi che Flask sia installato usando pip install flask o conda install flask se state utilizzando il gestore di ambiente virtuale conda.

API GET in Python usando Flask

Il metodo GET è un tipo di API che recupera informazioni da una fonte utilizzando il protocollo HyperText Transfer (HTTP).

Questo metodo è utilizzato per inviare una richiesta a un server dove i parametri della richiesta sono disponibili nell’URL come query.

Un esempio di richiesta GET:

https://api.example.com/data?key1=value1&key2=value2

State inviando una richiesta al server riguardante ‘key1’ con il valore ‘value1’ e ‘key2’ con il valore ‘value2’. I dati e le informazioni sono pubblicamente disponibili, e non c’è necessità di inviare parametri aggiuntivi al server oltre a quelli richiesti per la vostra query. Per esempio, credenziali o certificati non sono necessari.

Il metodo GET è anche utilizzato quando si carica un sito web.

In questa sezione, creeremo un’API GET in Python usando Flask per restituire una semplice pagina HTML.

Scriviamo il codice! Salvate il seguente codice come “app_GET.py“:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return """
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Congratulazioni</title>
    </head>
    <body>
        <div style="text-align: center; margin-top: 100px;">
            <h1>Congratulazioni, questo è il tuo primo endpoint API!</h1>
        </div>
    </body>
    </html>
    """

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

Bene, ora lanciate semplicemente l’applicazione Flask con il comando python app_GET.py e andate all’URL http://127.0.0.1:5000.

Vedrete la vostra prima API GET in Python usando Flask:

Realizzare API con Python e Flask

Questo è un caso molto semplice ma dovrebbe essere informativo. L’URL in cui troviamo l’API operativa si chiama endpoint.

Proviamo a costruire un esempio leggermente più complesso.

Creeremo un endpoint GET dove possiamo richiedere dati usando parametri di query.

I dati all’interno del nostro “server” nel file .py saranno:

data = [
    {"city": "Napoli", "country": "Italy"},
    {"city": "Pisa", "country": "Italy"},
    {"city": "Reykjavik", "country": "Iceland"},
    {"city": "Akureyri", "country": "Iceland"}
]

Ora, creeremo una sezione del nostro sito a “/cities”. Se accedete a questa pagina, restituirà tutte le città dal nostro dataset.

E se volessimo filtrare i nostri dati usando parametri dall’URL attraverso una query?

Bene, dovremo aggiungere alcune righe al nostro codice.

Implementeremo una logica semplice usando istruzioni condizionali in Python. Accetteremo parametri dalla query come segue:

  • Paese
  • Città
  • Sia Paese che Città
  • Nessuno dei precedenti

Pertanto, creeremo un’istruzione if-then-else in questo modo:

if city and country:
     filtered_cities = [c for c in data if c['city'] == city and c['country'] == country]
     return jsonify(filtered_cities)
elif city:
    filtered_cities = [c for c in data if c['city'] == city]
    return jsonify(filtered_cities)
elif country:
    filtered_cities = [c for c in data if c['country'] == country]
    return jsonify(filtered_cities)
else:
    return jsonify(data)

In quel codice possiamo gestire tutte le possibili combinazioni. Se applichiamo un filtro, riceveremo i dati filtrati.

Il nuovo codice completo sarà:

from flask import Flask, jsonify, request

app = Flask(__name__)

data = [
    {"city": "Napoli", "country": "Italy"},
    {"city": "Pisa", "country": "Italy"},
    {"city": "Reykjavik", "country": "Iceland"},
    {"city": "Akureyri", "country": "Iceland"}
]

@app.route('/cities', methods=['GET'])
def get_cities():
    city = request.args.get('city')
    country = request.args.get('country')

    if city and country:
        filtered_cities = [c for c in data if c['city'] == city and c['country'] == country]
        return jsonify(filtered_cities)
    elif city:
        filtered_cities = [c for c in data if c['city'] == city]
        return jsonify(filtered_cities)
    elif country:
        filtered_cities = [c for c in data if c['country'] == country]
        return jsonify(filtered_cities)
    else:
        return jsonify(data)
    
if __name__ == '__main__':
    app.run(debug=True)

Proviamo un esempio: se vogliamo ottenere una città italiana, possiamo usare questo URL:

http://127.0.0.1:5000/cities?country=Italy

Ma cosa succede se vogliamo inserire nuovi dati?

Per inserire dati utente, non possiamo usare il metodo GET.

Finora, abbiamo recuperato dati da un server o un URL senza inviare dati, tranne che per i parametri.

Se vogliamo inviare dati, dovremo creare un metodo POST.

API POST in Python con Flask

Il metodo POST ci permette di trasmettere informazioni a un server.

Per esempio, quando usiamo un modulo di login, inviamo le nostre credenziali al server per verificarne la correttezza e ottenere l’accesso al servizio. Questa operazione non riguarda solo la ricezione di dati dal server; l’utente sta anche trasmettendo dati al server.

Considerate questo scenario: vogliamo aggiungere una nuova città al dataset di città sul nostro sito web.

Come lo facciamo? La risposta sta nel metodo POST.

Esploriamo come possiamo creare un’API POST in Python con Flask.

Abbiamo la possibilità di creare un nuovo endpoint, ma per comodità useremo il vecchio.

Di seguito il codice per implementare questo:

@app.route('/cities', methods=['POST'])
def add_city():
    new_city = request.json
    if 'city' in new_city and 'country' in new_city:
        data.append(new_city)
        return jsonify({"message": "City added successfully", "city": new_city}), 201
    else:
        return jsonify({"error": "City and country are required fields"}), 400

Invieremo un JSON (un semplice dizionario Python) contenente i nostri nuovi dati, e questo endpoint aggiungerà i nuovi dati al nostro dataset di città e restituirà un messaggio con un codice.

Incorporando queste righe nel nostro codice precedente, il nostro file Python avrà questo aspetto:

from flask import Flask, jsonify, request

app = Flask(__name__)

data = [
    {"city": "Napoli", "country": "Italy"},
    {"city": "Pisa", "country": "Italy"},
    {"city": "Reykjavik", "country": "Iceland"},
    {"city": "Akureyri", "country": "Iceland"}
]

@app.route('/cities', methods=['GET'])
def get_cities():
    city = request.args.get('city')
    country = request.args.get('country')

    if city and country:
        filtered_cities = [c for c in data if c['city'] == city and c['country'] == country]
        return jsonify(filtered_cities)
    elif city:
        filtered_cities = [c for c in data if c['city'] == city]
        return jsonify(filtered_cities)
    elif country:
        filtered_cities = [c for c in data if c['country'] == country]
        return jsonify(filtered_cities)
    else:
        return jsonify(data)

@app.route('/cities', methods=['POST'])
def add_city():
    new_city = request.json
    if 'city' in new_city and 'country' in new_city:
        data.append(new_city)
        return jsonify({"message": "City added successfully", "city": new_city}), 201
    else:
        return jsonify({"error": "City and country are required fields"}), 400

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

Per inviare dati usando il metodo POST in Python, dobbiamo eseguire diverse righe di codice in un file Python separato.

Il codice per eseguire una richiesta POST in Python è il seguente:

import requests

url = 'http://127.0.0.1:5000/cities'
data = {'city': 'Sevilla', 'country': 'Spain'}
x = requests.post(url, json = data)
print(x.text)

Ora, proviamo una richiesta POST aggiungendo city = ‘Sevilla’ e country = ‘Spain’. Osserveremo il seguente output:

{
  "city": {
    "city": "Sevilla",
    "country": "Spain"
  },
  "message": "City added successfully"
}

Cosa succede se ora chiamiamo il nostro endpoint?

Ecco i dati aggiornati:

[
  {
    "city": "Napoli",
    "country": "Italy"
  },
  {
    "city": "Pisa",
    "country": "Italy"
  },
  {
    "city": "Reykjavik",
    "country": "Iceland"
  },
  {
    "city": "Akureyri",
    "country": "Iceland"
  },
  {
    "city": "Sevilla",
    "country": "Spain"
  }
]

Fantastico!

Abbiamo costruito con successo un’API POST in Python usando Flask in pochi semplici passi.

Ora possiamo recuperare dati da un URL o server usando il metodo GET e anche aggiungere nuovi dati usando il metodo POST.

Conclusioni

In questo tutorial ti ho fatto vedere come realizzare API con Python e Flask.

Abbiamo creato delle API di tipo GET e POST per la lettura e l’aggiornamento di dati tramite endpoint dedicati.

Se hai trovato utile questo contenuto, aiutami a crescere e a diffonderlo! Basta pochissimo, ma per me è molto importante 🙂

Trovi tutti i miei riferimenti qui: Medium, LinkedIn, Blog Pulp Learning.

Grazie:D