Flask: un framework per lo sviluppo web in Python

Immagine di Flask

Flask è un framework leggero e flessibile per lo sviluppo di applicazioni web in Python. È stato creato per semplificare il processo di creazione di applicazioni web e API (Application Programming Interface) utilizzando Python. Flask è considerato un micro-framework perché fornisce solo il minimo necessario per costruire applicazioni web, senza incorporare componenti aggiuntivi non necessari.

Caratteristiche chiave di Flask:

Esempio di utilizzo di Flask: il programma market_new.py

Nel programma market_new.py andiamo a creare inizialmente due tabelle all'interno del database "talentform" di mysql:
La prima tabella chiamata user, ci servirà per registrare gli utenti nell'applicazione tramite la loro mail e la loro passwprd

class Contocorrente:
   # Configura la connessione al database MySQL
db = mysql.connector.connect(
    host="localhost",
    user="root",
    password="",
    database="talentform"
)

# Crea la tabella per gli utenti se non esiste già
cursor = db.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, user_email VARCHAR(255) UNIQUE, password VARCHAR(255))")
db.commit()

# Crea la tabella per gli ordini se non esiste già
cursor.execute("CREATE TABLE IF NOT EXISTS orders (id INT AUTO_INCREMENT PRIMARY KEY, user_email VARCHAR(255), order_date DATETIME, product_banco VARCHAR(255), product_freschi VARCHAR(255), product_frigo VARCHAR(255), elettrodomestici VARCHAR(255), total_price DECIMAL(10, 2))")
db.commit()

Inoltre andiamo già a definire un dizionario che associa al tipo di prodotto un prezzo in euro

# Dizionario con i prezzi dei prodotti
product_prices = {
    "Tonno in scatola": 2.50,
    "Pasta": 2.00,
    "Latte": 1.20,
    "Carne": 8.00,
    "Pesce": 12.50,
    "Verdura": 2.50,
    "Yogurt": 1.80,
    "Formaggio": 3.50,
    "Televisore": 500.00,
    "Lavatrice": 400.00
}

Nella funzione login associata alla route ("/") quindi all'avvia dell'applicazione vengono innanzitutto controllati i valori degli input testuali "user_mail" e "password" ottenuti dal form html loginUser.html. Successivamente viene controllato se l'utente esiste:
1) Per fare questo si vanno a prendere tutti gli utenti registrati nella tabella users con le relative password:
Se l'utente viene trovato l'applicazione ritorna accedendo alla route "/selection" che vedremo in seguito ma porta alla pagina con la scelta dei prodotti
Altrimenti stampa un messaggio di errore


def login():
    if request.method == "POST":
        user_email = request.form.get("user_email")
        password = request.form.get("password")

        # Controlla se l'utente esiste
        cursor.execute("SELECT * FROM users WHERE user_email = %s", (user_email,))
        user = cursor.fetchone()

        if user:
            # Verifica la password
            hashed_password = hashlib.sha256(password.encode()).hexdigest()
            if user[2] == hashed_password:
                session["user_email"] = user_email
                return redirect(url_for("selections"))
            else:
                return render_template("loginUser.html", error="Credenziali non valide. Riprova.")
        else:
            return render_template("loginUser.html", error="Utente non esistente. Registrati.")

    return render_template("loginUser.html", error=None)

Questo è il codice html che verrà presentato all'utente quando accede all'applicazione. Alcune note:
Quando l'utente è in possesso di uno username e la password questo viene letto dalla funzione precedente login() tramite l'action del form
Se l'utente non è in possesso di questi dati viene reindirizzato all'app route di flask con indirizzo /registration


<form method="post" action="/">
    <div class="form-group">
        <label for="user_email">Email:</label>
        <input type="text" class="form-control" id="user_email" name="user_email" required>
    </div>
    <div class="form-group">
        <label for="password">Password:</label>
        <input type="password" class="form-control" id="password" name="password" required>
    </div>
    <input type="submit" class="btn btn-primary" value="Login">
</form>

        <p class="mt-3">Non hai un account? <a href="/registration">Registrati</a></p>

        

Analizziamo il codice della fuznione selections()
1) Innanzitutto dobbiamo dire che è associata alla url "/selections" e che accetta chiamate http sia di tipo get che di tipo post
2) Dopo viene verificato se lo username dell'utente è autenticato nella sessione: per fare questo utilizziamo il controllo (if "user_email" not in session) chè verifica se l'utente è autenticato controllando se l'indirizzo email dell'utente è presente nella sessione dell'utente. La sessione in Flask è un meccanismo per memorizzare dati specifici per ogni utente. Se l'utente non è autenticato (l'indirizzo email non è presente nella sessione), l'applicazione reindirizza l'utente alla pagina di login utilizzando redirect(url_for("login")). In questo modo, solo gli utenti autenticati possono accedere alla pagina "/selections".
3) Una volta effettuata questa operazione ed estratto l'user corrente questo viene utilizzato in una query per verificare se quell'utente ha già effetuato un ordine presso il sito
4) A questo punto vengono letti i valori delle scelte dell'utente relative ai select con i prodotti, queste serviranno a stabilire anche il prezzo totale della spesa
5) Tutti i dati, compresa la data attuale vengono regitrati nella tabella orders
6) infine la funzione ritorna la pagina html con le select, e vengono passati come parametri il dizionario con i prodotti, e (se esiste) l'ultimo ordine effettuato dal cliente


@app.route("/selections", methods=["GET", "POST"])
def selections():
    # Verifica se l'utente è autenticato
    if "user_email" not in session:
        return redirect(url_for("login"))
    user_email = session["user_email"]
    cursor.execute("SELECT * FROM orders WHERE user_email = %s ORDER BY last_access DESC LIMIT 1", (user_email,))
    last_order = cursor.fetchone()
    if request.method == "POST":
        user_email = session["user_email"]
        product_banco = request.form.get("product_banco")
        product_freschi = request.form.get("product_freschi")
        product_frigo = request.form.get("product_frigo")
        elettrodomestici = request.form.get("elettrodomestici")

        # Calcola il prezzo totale dell'ordine
        total_price = 0.0

        if product_banco:
            total_price += product_prices.get(product_banco, 0.0)

        if product_freschi:
            total_price += product_prices.get(product_freschi, 0.0)

        if product_frigo:
            total_price += product_prices.get(product_frigo, 0.0)

        if elettrodomestici:
            total_price += product_prices.get(elettrodomestici, 0.0)

        # Registra l'ordine nel database
        order_date = datetime.datetime.now()
        cursor.execute("INSERT INTO orders (user_email, last_access, product_banco, product_freschi, product_frigo, elettrodomestici, total_price) VALUES (%s, %s, %s, %s, %s, %s, %s)", (user_email, order_date, product_banco, product_freschi, product_frigo, elettrodomestici, total_price))
        db.commit()

        return "Ordine completato! Grazie per il tuo acquisto."

    return render_template("super.html", products=product_prices, last_order=last_order)

Anche in questo caso per il codice completo dell'applicazione puoi accedere da github Marketnew.py Invece per i file html attinenti all'applicazione puoi andare sulla cartella templates. I file che riguradano l'applicazione sono:
)1 loginUser.html
2) registration.html
3) super.html
Cartella templates
Attezione!!! ricordati che per rendere i tuoi file html in una applicazione flask e necessario inserirli in una cartella chiamata "templates"