Le web push notifications sono uno strumento efficace per mantenere l'utente coinvolto anche quando non è attivamente sulla tua applicazione web. In questo articolo, esploreremo come implementare le web push notifications utilizzando il framework Python Flask.
Prima di iniziare, è necessario avere una conoscenza di base di Python, Flask e JavaScript. Dovrai anche avere Node.js installato sul tuo sistema per poter utilizzare alcuni strumenti necessari.
Per implementare le push notifications, seguiremo questi passaggi:
- Configurare il server Flask.
 - Generare le chiavi VAPID per l'autenticazione.
 - Gestire l'iscrizione alle notifiche nel client.
 - Inviare le notifiche dal server Flask.
 
Per prima cosa, crea un progetto Flask. Inizia con l'installazione di Flask:
pip install Flask
Poi, crea un file app.py e configura una semplice app Flask:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
    return render_template('index.html')
if __name__ == "__main__":
    app.run(debug=True)
Crea anche un template HTML di base chiamato index.html nella cartella templates:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Web Push Notifications</title>
</head>
<body>
    <h1>Web Push Notifications con Flask</h1>
    <button id="subscribe">Iscriviti alle Notifiche</button>
    <script src="app.js"></script>
</body>
</html>
Le chiavi VAPID (Voluntary Application Server Identification) sono utilizzate per autenticare il server che invia le notifiche. Puoi generarle utilizzando un pacchetto npm chiamato web-push.
Installa web-push:
npm install web-push -g
Genera le chiavi VAPID:
web-push generate-vapid-keys
Questo comando ti fornirà una chiave pubblica e una chiave privata. Salva queste chiavi perché le useremo nel server Flask.
Nel file app.js, aggiungi il seguente codice per gestire l'iscrizione del client alle notifiche push:
const publicVapidKey = 'LA_TUA_CHIAVE_VAPID_PUBBLICA';
if ('serviceWorker' in navigator) {
    send().catch(err => console.error(err));
}
async function send() {
    const register = await navigator.serviceWorker.register('/worker.js', {
        scope: '/'
    });
    const subscription = await register.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: urlBase64ToUint8Array(publicVapidKey)
    });
    await fetch('/subscribe', {
        method: 'POST',
        body: JSON.stringify(subscription),
        headers: {
            'content-type': 'application/json'
        }
    });
}
function urlBase64ToUint8Array(base64String) {
    const padding = '='.repeat((4 - base64String.length % 4) % 4);
    const base64 = (base64String + padding)
        .replace(/-/g, '+')
        .replace(/_/g, '/');
    const rawData = window.atob(base64);
    const outputArray = new Uint8Array(rawData.length);
    for (let i = 0; i < rawData.length; ++i) {
        outputArray[i] = rawData.charCodeAt(i);
    }
    return outputArray;
}
Crea anche un file worker.js nella root del tuo progetto:
self.addEventListener('push', event => {
    const data = event.data.json();
    self.registration.showNotification(data.title, {
        body: data.message,
        icon: 'icon.png'
    });
});
Installa il pacchetto pywebpush:
pip install pywebpush
Aggiungi le seguenti righe al tuo app.py per gestire la sottoscrizione e inviare notifiche:
import json
from flask import request
from pywebpush import webpush, WebPushException
VAPID_PUBLIC_KEY = "LA_TUA_CHIAVE_VAPID_PUBBLICA"
VAPID_PRIVATE_KEY = "LA_TUA_CHIAVE_VAPID_PRIVATA"
@app.route('/subscribe', methods=['POST'])
def subscribe():
    subscription_info = request.get_json()
    return "Subscribed", 201
def send_web_push(subscription_information, message_body):
    try:
        webpush(
            subscription_info=subscription_information,
            data=json.dumps(message_body),
            vapid_private_key=VAPID_PRIVATE_KEY,
            vapid_claims={
                "sub": "mailto:tuo@email.com"
            }
        )
    except WebPushException as ex:
        print(f"Error: {repr(ex)}")
@app.route('/notify', methods=['POST'])
def notify():
    subscription_info = request.get_json()
    message = {
        "title": "Titolo della Notifica",
        "message": "Questo è il corpo della notifica"
    }
    send_web_push(subscription_info, message)
    return "Notification sent", 200
Ora, puoi testare le notifiche eseguendo l'app Flask e inviando una richiesta POST a /notify con i dati della sottoscrizione.
Conclusione
Con questi passaggi, hai implementato un semplice sistema di web push notifications utilizzando Flask. Questo esempio può essere ampliato e personalizzato per soddisfare le esigenze specifiche della tua applicazione. Le notifiche push sono un potente strumento per mantenere gli utenti coinvolti, e con Flask, la loro implementazione è abbastanza diretta.