Advertisement
  1. Code
  2. Coding Fundamentals
  3. Databases & SQL

Creazione di una Web App da zero utilizzando Python Flask e MySQL

In questa serie, utilizzeremo Python, Flask e MySQL per realizzare una semplice applicazione web da zero. Sarà una semplice applicazione per una lista dei desideri, dove gli utenti potranno registrarsi, accedere e creare le proprie liste dei desideri.
Scroll to top
This post is part of a series called Creating a Web App From Scratch Using Python Flask and MySQL.
Creating a Web App From Scratch Using Python Flask and MySQL: Part 2

Italian (Italiano) translation by Piergiorgio Sansone (you can also view the original English article)

In questa serie, utilizzeremo Python, Flask e MySQL per realizzare una semplice applicazione web da zero.  Sarà una semplice applicazione per una lista dei desideri, dove gli utenti potranno registrarsi, accedere e creare le proprie liste dei desideri.

Questo tutorial presume che abbiate una base di conoscenza del linguaggio di programmazione Python. Utilizzeremo Flask, un web application framework di Python, per realizzare la nostra applicazione con MySQL come back end.

Introduzione a Python Flask

Flask è un framework di Python per realizzare applicazioni web. Dal sito ufficiale,

Falsk è un microframework per Python basato su Werkzeug,  Jinja 2 e buone intenzioni.

Quando pensiamo a Python , de facto il framework che viene alla mente e Django Ma dal punto di vista un principiante del linguaggio Python, incominciare con Flask è più facile, a confronto con Django

Configurazione di Flask

Configurare Flask è abbastanza semplice e veloce. Con il package manager pip, tutto quello che dobbiamo fare è :

1
pip install flask

Una volta completata l'installazione di Flask, create una cartella e chiamatela FlaskApp. All'interno della cartella FlaskApp create il file chiamato app.py Importate il modulo di flask e create una app utilizzando Flask come mostrato:

1
from flask import Flask
2
app = Flask(__name__)

Ora definire il percorso di base / e il suo gestore dell richiesta corrispondente:

1
@app.route("/")
2
def main():
3
    return "Welcome!"

Successivamente, verificare se il file eseguito è il programma principale ed eseguite l'app:

1
if __name__ == "__main__":
2
    app.run()

Salvate le modifiche ed eseguite app.py :

1
python app.py

Puntate il browser a http://localhost:5000/ e dovreste ricevere un messaggio di benvenuto.

Creazione di una Home Page

Quando l'applicazione viene eseguita in primo luogo, dobbiamo mostrare una home page con le ultime voci delle liste aggiunte dagli utenti. Quindi cerchiamo di aggiungere alla nostra cartella applicazione nostra home page.

Flask cerca i file del modello all'interno della cartella templates. Quindi all'interno della cartella PythonApp create una cartella chiamata templates dentro templates, create un file chiamato index.html Aprite il file index.html ed aggiungete il seguente codice HTML:

1
<!DOCTYPE html>
2
<html lang="en">
3
4
<head>
5
    <title>Python Flask Bucket List App</title>
6
7
8
    <link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet">
9
10
    <link href="http://getbootstrap.com/examples/jumbotron-narrow/jumbotron-narrow.css" rel="stylesheet">
11
12
13
</head>
14
15
<body>
16
17
    <div class="container">
18
        <div class="header">
19
            <nav>
20
                <ul class="nav nav-pills pull-right">
21
                    <li role="presentation" class="active"><a href="#">Home</a>
22
                    </li>
23
                    <li role="presentation"><a href="#">Sign In</a>
24
                    </li>
25
                    <li role="presentation"><a href="showSignUp">Sign Up</a>
26
                    </li>
27
                </ul>
28
            </nav>
29
            <h3 class="text-muted">Python Flask App</h3>
30
        </div>
31
32
        <div class="jumbotron">
33
            <h1>Bucket List App</h1>
34
            <p class="lead"></p>
35
            <p><a class="btn btn-lg btn-success" href="showSignUp" role="button">Sign up today</a>
36
            </p>
37
        </div>
38
39
        <div class="row marketing">
40
            <div class="col-lg-6">
41
                <h4>Bucket List</h4>
42
                <p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>
43
44
                <h4>Bucket List</h4>
45
                <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>
46
47
                <h4>Bucket List</h4>
48
                <p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
49
            </div>
50
51
            <div class="col-lg-6">
52
                <h4>Bucket List</h4>
53
                <p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>
54
55
                <h4>Bucket List</h4>
56
                <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>
57
58
                <h4>Bucket List</h4>
59
                <p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
60
            </div>
61
        </div>
62
63
        <footer class="footer">
64
            <p>&copy; Company 2015</p>
65
        </footer>
66
67
    </div>
68
</body>
69
70
</html>

Aprite app.py ed importate render_template, che utilizzeremo per visualizzare i file del modello.

1
from flask import Flask, render_template

Modificate il metodo principale affinchè restituisca il file template. 

1
def main():
2
    return render_template('index.html')

Salvate le modifiche e riavviate il server. Puntate il browser su http://localhost:5000/ e dovreste vedere la schermata sottostante :

Bucket List App home pageBucket List App home pageBucket List App home page

Creazione di una pagina di registrazione

Step1: Impostazione del Database

Utilizzeremo MySQL come piattaforma di back end. Così accedete a MySQL da riga di comando, o se preferite potete utilizzare anche un'interfaccia grafica come MySQL Workbench. Innanzitutto, create un database chiamato BucketList. Dalla riga di comando:

1
mysql -u <username> -p

Inserite la password richiesta ed una volta entrati, eseguite il seguente comando per creare il database:

1
CREATE DATABASE BucketList;

Una volta creato il database, create una tabella chiamata tbl_user come mostrato

1
CREATE TABLE `BucketList`.`tbl_user` (
2
  `user_id` BIGINT NULL AUTO_INCREMENT,
3
  `user_name` VARCHAR(45) NULL,
4
  `user_username` VARCHAR(45) NULL,
5
  `user_password` VARCHAR(45) NULL,
6
  PRIMARY KEY (`user_id`));

Per la nostra applicazione Python utilizzeremo una Stored Procedure per interfacciarci con il database MySQL.  Cosi, una volta creata la tabella tbl_user, create una stored procedure chiamata sp_createUser per registrare un utente.

Quando avete creato una stored procedure per inserire un utente nella tabella tbl_user, prima dovete verificare se un utente con lo stesso username già esiste. Se esiste dobbiamo inviare un errore all'utente, altrimenti creeremo l'utente nella tabella utenti. Qui vi mostro come dovrebbe essere la stored procedure sp_createUser :

1
DELIMITER $$
2
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_createUser`(
3
    IN p_name VARCHAR(20),
4
  IN p_username VARCHAR(20),
5
	IN p_password VARCHAR(20)
6
)
7
BEGIN
8
	if ( select exists (select 1 from tbl_user where user_username = p_username) ) THEN
9
	
10
		select 'Username Exists !!';
11
	
12
	ELSE
13
	
14
		insert into tbl_user
15
		(
16
			user_name,
17
			user_username,
18
			user_password
19
		)
20
		values
21
		(
22
			p_name,
23
			p_username,
24
			p_password
25
		);
26
	
27
	END IF;
28
END$$
29
DELIMITER ;

Step 2 : Creare un'interfaccia di registrazione

Navigate la directory PythonApp/template e create il file HTML chiamato signup.html Aggiungete il seguente codice HTML nel file signup.html

1
<!DOCTYPE html>
2
<html lang="en">
3
  <head>
4
    <title>Python Flask Bucket List App</title>
5
6
   
7
    <link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet">
8
9
    <link href="http://getbootstrap.com/examples/jumbotron-narrow/jumbotron-narrow.css" rel="stylesheet">
10
    <link href="../static/signup.css" rel="stylesheet">
11
   
12
  </head>
13
14
  <body>
15
16
    <div class="container">
17
      <div class="header">
18
        <nav>
19
          <ul class="nav nav-pills pull-right">
20
            <li role="presentation" ><a href="main">Home</a></li>
21
            <li role="presentation"><a href="#">Sign In</a></li>
22
            <li role="presentation" class="active"><a href="#">Sign Up</a></li>
23
          </ul>
24
        </nav>
25
        <h3 class="text-muted">Python Flask App</h3>
26
      </div>
27
28
      <div class="jumbotron">
29
        <h1>Bucket List App</h1>
30
        <form class="form-signin">
31
        <label for="inputName" class="sr-only">Name</label>
32
        <input type="name" name="inputName" id="inputName" class="form-control" placeholder="Name" required autofocus>
33
        <label for="inputEmail" class="sr-only">Email address</label>
34
        <input type="email" name="inputEmail" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
35
        <label for="inputPassword" class="sr-only">Password</label>
36
        <input type="password" name="inputPassword" id="inputPassword" class="form-control" placeholder="Password" required>
37
        
38
        <button id="btnSignUp" class="btn btn-lg btn-primary btn-block" type="button">Sign up</button>
39
      </form>
40
      </div>
41
42
      
43
44
      <footer class="footer">
45
        <p>&copy; Company 2015</p>
46
      </footer>
47
48
    </div>
49
  </body>
50
</html>

Aggiungete anche il seguente CSS come signup.css nella cartella statica dentro PythonApp.

1
body {
2
  padding-top: 40px;
3
  padding-bottom: 40px;
4
}
5
6
.form-signin {
7
  max-width: 330px;
8
  padding: 15px;
9
  margin: 0 auto;
10
}
11
.form-signin .form-signin-heading,
12
.form-signin .checkbox {
13
  margin-bottom: 10px;
14
}
15
.form-signin .checkbox {
16
  font-weight: normal;
17
}
18
.form-signin .form-control {
19
  position: relative;
20
  height: auto;
21
  -webkit-box-sizing: border-box;
22
     -moz-box-sizing: border-box;
23
          box-sizing: border-box;
24
  padding: 10px;
25
  font-size: 16px;
26
}
27
.form-signin .form-control:focus {
28
  z-index: 2;
29
}
30
.form-signin input[type="email"] {
31
  margin-bottom: -1px;
32
  border-bottom-right-radius: 0;
33
  border-bottom-left-radius: 0;
34
}
35
.form-signin input[type="password"] {
36
  margin-bottom: 10px;
37
  border-top-left-radius: 0;
38
  border-top-right-radius: 0;
39
}

Nellaapp.py aggiungete un'altro metodo chiamato showSignUp per visualizzare la pagina di registrazione una volta ricevuta la richiesta /showSignUp

1
@app.route('/showSignUp')
2
def showSignUp():
3
    return render_template('signup.html')

Salvate le modifiche e riavviate il server. Cliccate sul bottone Sign Up nella home page e dovreste vedere la pagina di registrazione come mostrato:

Sign Up user pageSign Up user pageSign Up user page

Step 3: Implementare un metodo di registrazione

Successivamente, avremo bisogno di un metodo lato server per l'interfaccia utente per l'interazione con il database MySQL Andate su PythonApp e aprite app.py . Create un nuovo metodo e chiamatelo signUp ed aggiungete anche il percorso /signUp Qui potete vedere come appare:

1
@app.route('/signUp')
2
def signUp():
3
    # create user code will be here !!

Utilizzeremo jQuery AJAX per scrivere i dati di registrazione nel metodo signUp, e specificheremo il metodo nella definizione del percorso.

1
@app.route('/signUp',methods=['POST'])
2
def signUp():
3
    # create user code will be here !!

Per poter leggere i valori assegnati  dobbiamo importare da Flask request

1
from flask import Flask, render_template, request

Utilizzando request possiamo leggere i valori assegnati come mostrato sotto:

1
@app.route('/signUp',methods=['POST'])
2
def signUp():
3
4
    # read the posted values from the UI

5
    _name = request.form['inputName']
6
    _email = request.form['inputEmail']
7
    _password = request.form['inputPassword']

Una volta letti i valori, dovremmo semplicemente verificarne la validità ed inviare un semplice messaggio:

1
@app.route('/signUp',methods=['POST'])
2
def signUp():
3
4
    # read the posted values from the UI

5
    _name = request.form['inputName']
6
    _email = request.form['inputEmail']
7
    _password = request.form['inputPassword']
8
9
    # validate the received values

10
    if _name and _email and _password:
11
        return json.dumps({'html':'<span>All fields good !!</span>'})
12
    else:
13
        return json.dumps({'html':'<span>Enter the required fields</span>'})

Importeremo anche  json da Flask, dato che lo stiamo usando nel codice precedente per restituire i dati json.

1
from flask import Flask, render_template, json, request

Step 4: Creare una richiesta di registrazione

Per inviare al metodo Python la richiesta di registrazione utilizzeremo jQuery AJAX . Scaricate  ed mettete  jQuery all'interno della directory PythonApp/static/js  ed aggiungete il link nella pagina di registrazione. Una volta inserito il jQuery , aggiungeremo la richiesta POST jQuery quando l'utente clicca il tasto di registrazione.

Così, fissate l'evento al click del pulsante di registrazione come indicato:

1
$(function() {
2
    $('#btnSignUp').click(function() {
3
4
        $.ajax({
5
            url: '/signUp',
6
            data: $('form').serialize(),
7
            type: 'POST',
8
            success: function(response) {
9
                console.log(response);
10
            },
11
            error: function(error) {
12
                console.log(error);
13
            }
14
        });
15
    });
16
});

Salvate tutte le modifiche e riavviate il server. Dalla pagina di registrazione, completate in dettaglio i form e cliaccate registrati Verificate il browser e vedrete il messaggio sottostante:

1
{"html": "<span>All fields good !!</span>"} 

Step 5 : Chiamare la Store Procedure MySQL

Una volta ottenuti nome , indirizzo email e password, possiamo semplicemente chiamare la stored procedure MySQL per creare il nuovo utente.

 Per connetterci con MySQL, utilizzeremo Flask-MySQL che è un'estensione di Flask  Per iniziare con Flask-MySQL, installatelo usando il package manager pip

1
pip install flask-mysql

Importate MySQL dentro app.py:

1
from flask.ext.mysql import MySQL

All'inizio abbiamo definito la nostra app come mostrato:

1
app = Flask(__name__)

Oltre questo includete le seguenti configurazioni MySQL:

1
mysql = MySQL()
2
3
# MySQL configurations

4
app.config['MYSQL_DATABASE_USER'] = 'jay'
5
app.config['MYSQL_DATABASE_PASSWORD'] = 'jay'
6
app.config['MYSQL_DATABASE_DB'] = 'BucketList'
7
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
8
mysql.init_app(app)

Innanzitutto, create la connessione MySQL :

1
conn = mysql.connect()

Una volta creata la connessione, richiameremo un cursore per interrogare la nostra stored procedure. Cosi, utilizzando il comando conn connessione, create un cursore.

1
cursor = conn.cursor()

Prima di chiamare l'utente creato con la stored procedure, nascondiamo la nostra password utilizzando un helper fornito da Werkzeug. Importate il modulo in app.py:

1
from werkzeug import generate_password_hash, check_password_hash

Utilizzare il modulo di copertura per creare la password nascosta.

1
_hashed_password = generate_password_hash(_password)

Adesso , richiamiamo la procedura sp_createUser :

1
cursor.callproc('sp_createUser',(_name,_email,_hashed_password))

Se la procedura viene eseguita correttamente, allora sarà eseguito il commit delle modifiche e verrà restituito un messaggio dell'aggiornamento.

1
data = cursor.fetchall()
2
3
if len(data) is 0:
4
    conn.commit()
5
    return json.dumps({'message':'User created successfully !'})
6
else:
7
    return json.dumps({'error':str(data[0])})

Salvate le modifiche e riavviate il server.   Andate nella pagina di registrazione ed inserite il nome, indirizzo email e la password e cliccate il tasto registra. Creato utente con successo, sarete in grado di vedere un messaggio sul vostro browser.

1
{"message": "User created successfully !"}

Riassumendo

In questo tutorial, abbiamo visto come iniziare con la creazione di un'applicazione web utilizzando Python Flask, MySQL e l'estensione Flask-MySQL. Abbiamo creato e progettato le tabelle del database e la stored procedure e implementata la funzionalità di registrazione. Nel prossimo tutorial, ti portiamo questa serie al livello successivo implementando funzionalità di accesso e alcune altre caratteristiche.

Codice sorgente da questo tutorial è disponibile su GitHub.

Fateci sapere i vostri pensieri nei commenti qui sotto!

Advertisement
Advertisement