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.
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"