Erstellen einer Web-App von Grund auf mit Python Flask und MySQL
German (Deutsch) translation by Katharina Grigorovich-Nevolina (you can also view the original English article)
In dieser Serie verwenden wir Python, Flask und MySQL, um eine einfache Webanwendung von Grund auf zu erstellen. Es wird eine einfache Bucket-List-Anwendung sein, in der Benutzer sich registrieren, sich anmelden und ihre Bucket-Liste erstellen können.
Dieses Tutorial setzt voraus, dass Sie über Grundkenntnisse der Programmiersprache Python verfügen. Wir werden Flask, ein Python-Webanwendungs-Framework, verwenden, um unsere Anwendung mit MySQL als Back-End zu erstellen.
Einführung in Python Flask
Flask ist ein Python-Framework zum Erstellen der Webanwendungen. Von der offiziellen Seite
Flask ist ein Mikro-Framework für Python, das auf Werkzeug, Jinja 2 und guten Absichten basiert.
Wenn wir an Python denken, ist das De-facto-Framework, das uns in den Sinn kommt, das Django-Framework. Aus der Sicht eines Python-Anfängers ist es jedoch einfacher, mit Flask zu beginnen, wenn man es mit Django vergleicht.
Flask einrichten
Das Flask-Einrichten ist ziemlich einfach und schnell. Mit dem pip-Paketmanager müssen wir nur noch Folgendes tun:
1 |
pip install flask |
Wenn Sie mit der Flask-Installation fertig sind, erstellen Sie einen Ordner namens FlaskApp. Navigieren Sie zum FlaskApp-Ordner und erstellen Sie eine Datei mit dem Namen app.py. Importieren Sie das flask-Modul und erstellen Sie eine App mit der folgenden Flasche:
1 |
from flask import Flask |
2 |
app = Flask(__name__) |
Definieren Sie nun die Basisroute / und den entsprechenden Anforderungshandler:
1 |
@app.route("/") |
2 |
def main(): |
3 |
return "Welcome!" |
Prüfen Sie anschließend, ob die ausgeführte Datei das Hauptprogramm ist, und führen Sie die App aus:
1 |
if __name__ == "__main__": |
2 |
app.run() |
Speichern Sie die Änderungen und führen Sie app.py aus:
1 |
python app.py |
Richten Sie Ihren Browser auf http://localhost:5000/ und Sie sollten die Begrüßungsnachricht haben.
Erstellen einer Startseite
Erstens, wenn die Anwendung ausgeführt wird, sollten wir eine Startseite mit den neuesten, von Benutzern hinzugefügten Bucket-Listenelementen anzeigen. Fügen wir also unsere Startseite unserem Anwendungsordner hinzu.
Flask sucht nach Vorlagendateien im templates-Ordner. Navigieren Sie also zum PythonApp-Ordner und erstellen Sie einen Ordner mit dem Namen templates. Erstellen Sie in templates eine Datei namens index.html. Öffnen Sie index.html und fügen Sie den folgenden HTML-Code hinzu:
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>© Company 2015</p> |
65 |
</footer>
|
66 |
|
67 |
</div>
|
68 |
</body>
|
69 |
|
70 |
</html>
|
Öffnen Sie app.py und importieren Sie render_template, das wir zum Rendern der Vorlagendateien verwenden werden.
1 |
from flask import Flask, render_template |
Ändern Sie die Hauptmethode, um die gerenderte Vorlagendatei zurückzugeben.
1 |
def main(): |
2 |
return render_template('index.html') |
Speichern Sie die Änderungen und starten Sie den Server neu. Richten Sie Ihren Browser auf http://localhost:5000/ und Sie sollten den folgenden Bildschirm haben:



Eine Anmeldeseite erstellen
Schritt 1: Einrichten der Datenbank
Wir werden MySQL als Backend verwenden. Melden Sie sich also über die Befehlszeile zu MySQL an, oder wenn Sie eine GUI, wie die MySQL-Werkbank bevorzugen, können Sie diese auch verwenden. Erstellen Sie zuerst eine Datenbank mit dem Namen BucketList. Von der Kommandozeile aus:
1 |
mysql -u <username> -p |
Geben Sie das erforderliche Kennwort ein und führen Sie nach dem Anmelden den folgenden Befehl aus, um die Datenbank zu erstellen:
1 |
CREATE DATABASE BucketList; |
Sobald die Datenbank erstellt wurde, erstellen Sie eine Tabelle mit dem Namen tbl_user wie folgt:
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`)); |
Wir werden Stored procedures für unsere Python-Anwendung verwenden, um mit der MySQL-Datenbank zu interagieren. Sobald die Tabelle tbl_user erstellt wurde, erstellen Sie eine gespeicherte Prozedur mit dem Namen sp_createUser, um einen Benutzer anzumelden.
Wenn Sie eine gespeicherte Prozedur zum Erstellen eines Benutzers in der Tabelle tbl_user erstellen, müssen Sie zunächst prüfen, ob bereits ein Benutzer mit demselben username vorhanden ist. Wenn es der Fall ist, müssen wir einen Fehler an den Benutzer senden. Andernfalls erstellen wir den Benutzer in der Benutzertabelle. So würde die gespeicherte Prozedur sp_createUser aussehen:
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 ; |
Schritt 2: Erstellen Sie eine Anmeldeoberfläche
Navigieren Sie zum Verzeichnis PythonApp/templates und erstellen Sie eine HTML-Datei mit dem Namen signup.html. Fügen Sie den folgenden HTML-Code zu signup.html hinzu:
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>© Company 2015</p> |
46 |
</footer>
|
47 |
|
48 |
</div>
|
49 |
</body>
|
50 |
</html>
|
Fügen Sie dem statischen Ordner in PythonApp außerdem das folgende CSS als signup.css hinzu.
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 |
}
|
Fügen Sie in app.py eine weitere Methode namens showSignUp hinzu, um die Anmeldeseite zu rendern, sobald eine Anforderung nach /showSignUp gestellt wird:
1 |
@app.route('/showSignUp') |
2 |
def showSignUp(): |
3 |
return render_template('signup.html') |
Speichern Sie die Änderungen und starten Sie den Server neu. Klicken Sie auf der Startseite auf die Anmelden (Sign Up)-Taste, und die Anmeldeseite sollte wie gezeigt angezeigt werden:



Schritt 3: Implementieren Sie eine Anmeldemethode
Als Nächstes benötigen wir eine serverseitige Methode, damit die Benutzeroberfläche mit der MySQL-Datenbank interagieren kann. Navigieren Sie also zu PythonApp und öffnen Sie app.py. Erstellen Sie eine neue Methode namens signUp und fügen Sie auch eine Route /signUp hinzu. So sieht es aus:
1 |
@app.route('/signUp') |
2 |
def signUp(): |
3 |
# create user code will be here !!
|
Wir werden jQuery AJAX verwenden, um unsere Anmeldedaten an die signUp-Methode zu senden. Daher geben wir die Methode in der Routendefinition an.
1 |
@app.route('/signUp',methods=['POST']) |
2 |
def signUp(): |
3 |
# create user code will be here !!
|
Um die gebuchten Werte zu lesen, müssen wir request aus der Flask importieren.
1 |
from flask import Flask, render_template, request |
Mit request können wir die gebuchten Werte wie folgt lesen:
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'] |
Sobald die Werte gelesen sind, überprüfen wir einfach, ob sie gültig sind, und lassen Sie uns vorerst eine einfache Nachricht zurückgeben:
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>'}) |
Importieren Sie auch json aus Flask, da wir ihn im obigen Code verwenden, um json-Daten zurückzugeben.
1 |
from flask import Flask, render_template, json, request |
Schritt 4: Erstellen Sie eine Registrierungsanfrage
Wir werden jQuery AJAX verwenden, um die Anmeldeanforderung an die Python-Methode zu senden. Laden Sie jQuery in PythonApp/static/js herunter, und fügen Sie es von der Anmeldeseite aus hinzu. Sobald jQuery enthalten ist, fügen wir eine jQuery-POST-Anforderung hinzu, wenn der Benutzer auf die Sign Up-Taste klickt.
Fügen wir also das Klickereignis der Anmeldetaste wie gezeigt hinzu:
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 |
});
|
Speichern Sie alle Änderungen und starten Sie den Server neu. Geben Sie auf der Sign Up-Seite die Details ein und klicken Sie auf Sign Up. Überprüfen Sie die Browserkonsole und Sie sollten die folgende Meldung haben:
1 |
{"html": "<span>All fields good !!</span>"} |
Schritt 5: Rufen Sie die gespeicherte MySQL-Prozedur auf
Sobald wir name, die email address und das password haben, können wir einfach die gespeicherte Prozedur von MySQL aufrufen, um den neuen Benutzer zu erstellen.
Um sich mit MySQL zu verbinden, verwenden wir Flask-MySQL, eine Flask-Erweiterung. Um mit Flask-MySQL zu beginnen, installieren Sie es mit dem pip-Paketmanager:
1 |
pip install flask-mysql
|
Importieren Sie MySQL in app.py:
1 |
from flask.ext.mysql import MySQL |
Zuvor haben wir unsere App wie folgt definiert:
1 |
app = Flask(__name__) |
Dazu gehören die folgenden MySQL-Konfigurationen:
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) |
Zuerst erstellen wir die MySQL-Verbindung:
1 |
conn = mysql.connect() |
Sobald die Verbindung hergestellt ist, benötigen wir einen cursor, um unsere gespeicherte Prozedur abzufragen. Erstellen Sie einen Cursor mit conn-Verbindung.
1 |
cursor = conn.cursor() |
Bevor wir die gespeicherte Prozedur create user aufrufen, lassen Sie uns unser Kennwort mit einem von Werkzeug bereitgestellten Helfer salzen. Importieren Sie das Modul in app.py:
1 |
from werkzeug import generate_password_hash, check_password_hash |
Verwenden Sie das Salting-Modul, um das Hash-Kennwort zu erstellen.
1 |
_hashed_password = generate_password_hash(_password) |
Rufen wir nun die Prozedur sp_createUser auf:
1 |
cursor.callproc('sp_createUser',(_name,_email,_hashed_password)) |
Wenn die Prozedur erfolgreich ausgeführt wird, übernehmen Sie die Änderungen und senden die Erfolgsmeldung zurück.
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])}) |
Speichern Sie die Änderungen und starten Sie den Server neu. Gehen Sie zur Anmeldeseite, geben Sie name, email-adresse und password ein und klicken Sie auf die Anmelden (Sign Up)-Taste. Bei erfolgreicher Benutzererstellung wird eine Nachricht in der Browserkonsole angezeigt.
1 |
{"message": "User created successfully !"}
|
Packen Sie es ein
In diesem Tutorial haben wir gesehen, wie Sie mit dem Erstellen einer Webanwendung mit Python Flask, MySQL und der Erweiterung Flask-MySQL beginnen können. Wir haben die Datenbanktabellen und die gespeicherte Prozedur erstellt und entworfen und die Anmeldefunktionalität implementiert. Im nächsten Tutorial werden wir diese Serie auf die nächste Stufe bringen, indem wir die Anmeldefunktionalität und einige andere Funktionen implementieren.
Der Quellcode aus diesem Tutorial ist auf GitHub verfügbar.
Teilen Sie uns Ihre Meinung in den Kommentaren unten mit!



