Guida completa a Python
Capitolo 16 – Progetti Pratici per esercitarti: Livello AVANZATO
Progetto | Cosa impari |
---|---|
🌐 Mini sito web con Flask | HTML, routing, form, rendering |
📈 Dashboard dati CSV | Flask + pandas + matplotlib |
🧠 Previsione prezzo (ML base) | scikit-learn , regressione |
📦 Gestione inventario | CRUD completo con salvataggio (file o DB) |
👨💼 Login + area privata in Flask | gestione utenti, sessioni, sicurezza base |
1. Mini sito web con Flask
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def home():
return "<h1>🌐 Benvenuto nella mia prima web app Flask!</h1>"
@app.route("/about")
def about():
return "<p>Questa è una semplice pagina about.</p>"
if __name__ == "__main__":
app.run(debug=True)
📍 Naviga su http://127.0.0.1:5000 dopo averlo lanciato con
python app.py
2. Dashboard dati CSV (Flask + Pandas + Matplotlib)
from flask import Flask, render_template_string
import pandas as pd
import matplotlib.pyplot as plt
import io
import base64
app = Flask(__name__)
@app.route("/")
def dashboard():
df = pd.read_csv("studenti.csv")
# crea grafico
plt.figure()
df.plot(x="Nome", y="Voti", kind="bar", legend=False)
plt.title("Voti degli studenti")
plt.tight_layout()
img = io.BytesIO()
plt.savefig(img, format="png")
img.seek(0)
grafico_url = base64.b64encode(img.getvalue()).decode()
html = '''
<h1>📊 Dashboard Studenti</h1>
<img src="data:image/png;base64,{{ grafico_url }}">
'''
return render_template_string(html, grafico_url=grafico_url)
if __name__ == "__main__":
app.run(debug=True)
📌 Usa un file
studenti.csv
con:
CopiaModificaNome,Voti
Anna,30
Luca,25
Marco,28
3. Previsione prezzi (ML base con scikit-learn)
import pandas as pd
from sklearn.linear_model import LinearRegression
# Dataset esempio
dati = {
"Giorni": [1, 2, 3, 4, 5],
"Prezzo": [10, 12, 15, 18, 20]
}
df = pd.DataFrame(dati)
# Modello
X = df[["Giorni"]]
y = df["Prezzo"]
model = LinearRegression()
model.fit(X, y)
giorno = int(input("📅 Inserisci il giorno per la previsione: "))
prezzo_previsto = model.predict([[giorno]])
print(f"💰 Prezzo previsto per il giorno {giorno}: {prezzo_previsto[0]:.2f}€")
4. Gestione inventario (CRUD su file)
import csv
import os
FILE = "inventario.csv"
def carica():
if not os.path.exists(FILE):
return []
with open(FILE, newline="") as f:
return list(csv.DictReader(f))
def salva(dati):
with open(FILE, "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["Nome", "Quantità"])
writer.writeheader()
writer.writerows(dati)
def aggiungi():
nome = input("📦 Nome oggetto: ")
quant = input("🔢 Quantità: ")
dati.append({"Nome": nome, "Quantità": quant})
salva(dati)
def mostra():
for item in dati:
print(f"{item['Nome']} - {item['Quantità']} pezzi")
dati = carica()
while True:
print("\nMENU INVENTARIO")
print("1. Aggiungi oggetto")
print("2. Mostra oggetti")
print("3. Esci")
scelta = input("Scelta: ")
if scelta == "1":
aggiungi()
elif scelta == "2":
mostra()
elif scelta == "3":
break
5. Login + area privata (Flask base)
from flask import Flask, render_template_string, request, redirect, url_for
app = Flask(__name__)
USERS = {"admin": "1234"}
@app.route("/", methods=["GET", "POST"])
def login():
if request.method == "POST":
u = request.form["username"]
p = request.form["password"]
if USERS.get(u) == p:
return redirect(url_for("area_privata", user=u))
else:
return "<p>❌ Login fallito</p>"
return '''
<form method="post">
Username: <input name="username"><br>
Password: <input type="password" name="password"><br>
<button type="submit">Login</button>
</form>
'''
@app.route("/area/<user>")
def area_privata(user):
return f"<h1>👋 Benvenuto, {user}!</h1><p>Questa è l'area privata.</p>"
if __name__ == "__main__":
app.run(debug=True)