Siti Statici e Dinamici
Enrico Bacis Marco Rosa
Università degli Studi di Bergamo


github pages = free (static) hosting

Static website generators
a.k.a. in medio stat virtus
Frontend vs Backend


Python FAQ
- Perché
non PHP ?
- Perché
non ruby ?
- Perché
non java ?
- Perché non nodejs, .NET, scala ?!
-
Perché sempre python?
- è
una persecuzione !




Free Python hosting

Why flask?
- Microframework (core + extensions)
- Easy to code
- Easy to configure
- Excellent documentation
- Will not take decisions for you


-
Model salvataggio / caricamento dati (db)
-
View presentazione dei dati all’utente (templates)
- Controller codice che gestisce effettivamente una richiesta HTTP: effettua operazioni sul model, riempe i templates e invia una risposta all'utente
hello, world!
from flask import Flask # si importa Flask
app = Flask(__name__) # si crea l'app (__name__ su pythonanywhere)
@app.route('/') # si crea un instradamento (route) di default ('/')
def root(): # la funzione (ossia il controller) da eseguire
return "hello, world!" # deve tornare una stringa (il response body)
app.run(host="0.0.0.0", port=5000) # avvia il server6 lines of code and it works

Templates
-
return HTML
-
pass variables
-
conditionals (if)
-
loops (for)
Esercizio Templates
-
creare una route "/supermarket" che mostri una tabella dei prodotti disponibili (nome prodotto, costo)
-
Per i prodotti gratuiti mostrare "free" in grassetto
-
Per gli altri stampare mostrare "x €"
-
Applicare stili a piacere
-
Eseguire su pythonanywhere
prices = {'strawberry': 2.0, 'lemon': 1.0, 'bitcoin': 7000.0, 'spam': 0}Passaggio di parametri
GET e POST

mycontroller
mycontroller
Esercizio GET
-
creare una route "/getprice/<product>" che restituisca il prezzo del prodotto oppure un messaggio a piacere se il prodotto non c'è
-
Applicare stili a piacere
-
Eseguire su pythonanywhere
prices = {'strawberry': 2.0, 'lemon': 1.0, 'bitcoin': 7000.0, 'spam': 0}Esercizio POST
-
creare una route "/calculator" che agisca come una calcolatrice (2 campi input nella form e calcolo della somma)
-
Applicare stili a piacere
-
Eseguire su pythonanywhere
Esercizio POST II
-
creare una route "/notes" che:
-
Mostri in un elenco le note presenti nella lista
-
Abbia una form che permetta di aggiungerne
-
-
Applicare stili a piacere
-
Eseguire su pythonanywhere
notes = []E quando riavvio
il server?
SQLite

import sqlite3
notesdb = "notes.db"
def init_notes_db(reset=False):
connection = sqlite3.connect(notesdb)
if reset:
connection.execute("DROP TABLE IF EXISTS notes;")
connection.execute("CREATE TABLE IF NOT EXISTS notes (data VARCHAR)")
connection.commit()
connection.close()
init_notes_db()Esercizio SQLite
-
Rifare l'esercizio "/notes" utilizzando un
database SQLite -
Eseguire su pythonanywhere
Esercizio SQLite II
-
Creare una tabella nel database con 2 campi: data e userid
-
Creare la route "/secret/<userid>" che mostri e salvi solo le note per quell'userid
-
Eseguire su pythonanywhere

Hints
- E se mettessimo un doppio apice come utente?
- Perché fa così?
- Come faccio a fare una condizione vera?
- (e con sintassi valida)
link to slides: slides.com/enricobacis/websites
link to code: github.com/unibg-seclab/flask-bdweb
Siti Statici e Dinamici
By Enrico Bacis
Siti Statici e Dinamici
Introduzione a Flask
- 676