{"id":1209,"date":"2016-06-03T20:51:35","date_gmt":"2016-06-03T20:51:35","guid":{"rendered":"http:\/\/wp.andreas.bieri.name\/myblog\/?p=1209"},"modified":"2016-06-03T20:51:35","modified_gmt":"2016-06-03T20:51:35","slug":"democode-hallo-welt-projekt-mit-pythonflask-und-redis","status":"publish","type":"post","link":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/","title":{"rendered":"Democode: Hallo Welt Projekt mit Python\/Flask und Redis"},"content":{"rendered":"<p>Eine erste Programmier\u00fcbung mit Flask, programmiert nach einem <a href=\"https:\/\/mva.microsoft.com\/en-us\/training-courses\/introduction-to-creating-websites-using-python-and-flask-8677\" target=\"_blank\">Kurs der Microsoft Virtual Academy<\/a>\u00a0von <a href=\"https:\/\/github.com\/GeekTrainer\" target=\"_blank\">Christopher Harrison<\/a> und Susan Ibach (<a href=\"https:\/\/susanibach.wordpress.com\/\" target=\"_blank\">ihr Blog<\/a>).\u00a0Weitere Kurse und Blogs zu Python, Flask gibt es bei Channel 9 (auch diesen Kurs und diesen <a href=\"https:\/\/mva.microsoft.com\/de-de\/training-courses\/web-development-mit-python-16151?l=UhNeS06GC_1205192797\" target=\"_blank\">inhaltlich \u00e4hnlichen mit Django<\/a>) und <a href=\"http:\/\/blog.geektrainer.com\/\" target=\"_blank\">Geektrainer<\/a>. Eine Liste von Blogs und Youtube Filmen zu flask, Python \u00a0und bottle (eine verwandtes Framework) ist <a href=\"http:\/\/wp.andreas.bieri.name\/myblog\/index.php\/2015\/12\/01\/flaschen-fur-den-mikrocontroller-flask-bottle\/\">hier<\/a> zu finden.<\/p>\n<p>Wer den mehrst\u00fcndigen erstklassigen (aber auch langf\u00e4digen) Kurs mitgemacht hat, wird mit einer kleinen Quiz-Applikation belohnt. Die Entwicklungsarbeit erfolgt mit Visual Studio 2015 mit einer lokalen Pythonumgebung sowie einer lokalen flask-Runtime. Der Kurs zeigt auch den Aufbau der Visual Studio Programmierumgebung f\u00fcr Python, in dem Sinne ist er sehr selbsterkl\u00e4rend und anf\u00e4ngerfreundlich.<\/p>\n<p>Das Quiz wird mit dem flask Framework erstellt und enth\u00e4lt eine Redis-Datenbank.\u00a0 Die Take-Aways sind die folgenden:<\/p>\n<ul>\n<li>Installation von Visual Studio und Einrichtung f\u00fcr die Entwicklung von Python-L\u00f6sungen<\/li>\n<li>Installation von Redis<\/li>\n<li>Erstellung von Webseiten mit dem flask Framework<\/li>\n<li>Umgang mit Eingabefeldern<\/li>\n<li>Speichern und Lesen von Daten in einer Datenbank (redis)<\/li>\n<\/ul>\n<p>Das Quiz ist sehr simpel, zeigt aber schon viele Funktionen: nach Aufruf der (evtl. noch lokal gehosteten) Webseite<\/p>\n<p><img loading=\"lazy\" class=\" wp-image-1211 alignnone\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-1.png\" alt=\"mva-flask-1\" width=\"369\" height=\"188\" srcset=\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-1.png 322w, http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-1-300x153.png 300w\" sizes=\"(max-width: 369px) 100vw, 369px\" \/><\/p>\n<p>kann unter einem Titel eine Frage eingetragen werden, die in der redis Datenbank gespeichert wird; sie geht also nicht verloren.<\/p>\n<p><img loading=\"lazy\" class=\" wp-image-1212 alignnone\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-2.png\" alt=\"mva-flask-2\" width=\"210\" height=\"158\" srcset=\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-2.png 369w, http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-2-300x225.png 300w\" sizes=\"(max-width: 210px) 100vw, 210px\" \/><img loading=\"lazy\" class=\" wp-image-1213 alignnone\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-3.png\" alt=\"mva-flask-3\" width=\"316\" height=\"153\" srcset=\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-3.png 465w, http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-3-300x145.png 300w\" sizes=\"(max-width: 316px) 100vw, 316px\" \/><\/p>\n<p>Die Quizfrage kann mit dem Titel hervorgeholt (<span style=\"color: #3366ff;\">\/question\/Rechnen<\/span>, Grossschreibung beachten) und beantwortet werden, mit entsprechender R\u00fcckmeldung.\u00a0Es gibt auch eine Info-Seite.<\/p>\n<p><img loading=\"lazy\" class=\" wp-image-1215 alignnone\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-5.png\" alt=\"mva-flask-5\" width=\"292\" height=\"133\" srcset=\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-5.png 552w, http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-5-300x136.png 300w\" sizes=\"(max-width: 292px) 100vw, 292px\" \/>\u00a0<img loading=\"lazy\" class=\" wp-image-1216 alignnone\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-6.png\" alt=\"mva-flask-6\" width=\"389\" height=\"128\" srcset=\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-6.png 595w, http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-6-300x98.png 300w\" sizes=\"(max-width: 389px) 100vw, 389px\" \/><\/p>\n<p><img loading=\"lazy\" class=\"wp-image-1217 alignleft\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-7.png\" alt=\"mva-flask-7\" width=\"264\" height=\"128\" srcset=\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-7.png 535w, http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-7-300x145.png 300w\" sizes=\"(max-width: 264px) 100vw, 264px\" \/><\/p>\n<p><img loading=\"lazy\" class=\" wp-image-1218 alignnone\" src=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-8.png\" alt=\"mva-flask-8\" width=\"183\" height=\"88\" srcset=\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-8.png 385w, http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-content\/uploads\/2016\/06\/mva-flask-8-300x145.png 300w\" sizes=\"(max-width: 183px) 100vw, 183px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Das Projekt besteht aus diesen Dateien:<\/p>\n<ul>\n<li>Hauptprogramm mit app.py, routes.py, requirements.txt<\/li>\n<li>5 statische html Dateien (AnswerQuestion.html, Correct.html, CreatedQuestion.html, CreateQuestion.html, Incorrect.html)<\/li>\n<\/ul>\n<p>Diese Dateien sind hier abgebildet, ohne die gesamte Visual Studio Solution und weiteres Drumherum, das vom Internet geholt wird. Auf der MVA Webseite gibt es ausser dem Video auch PPT Pr\u00e4sentationejn und den originalen Source Code (der hier etwas modifiziert worden ist).<\/p>\n<p>Die Datei requirements.txt wird nur intern f\u00fcr Visual Studio gebraucht.<\/p>\n<p><span style=\"color: #3366ff;\"><strong><span style=\"font-size: small;\">requirements.txt<\/span><\/strong><\/span><\/p>\n<pre>flask<\/pre>\n<p>Die app.py start das lokale flask Runtime, das von VS aufgestartet wird. Diese Datei muss nicht ver\u00e4ndert werden.<\/p>\n<p><span style=\"color: #3366ff;\"><strong><span style=\"font-size: small;\">app.py<\/span><\/strong><\/span><\/p>\n<pre>\"\"\"\nThis script runs the application using a development server.\nIt contains the definition of routes and views for the application.\n\"\"\"\n# Module: flask\n# redis <a href=\"https:\/\/github.com\/rgl\/redis\/downloads\">https:\/\/github.com\/rgl\/redis\/downloads<\/a> <a href=\"http:\/\/www.codeproject.com\/Articles\/715967\/Running-Redis-as-a-Windows-Service\">http:\/\/www.codeproject.com\/Articles\/715967\/Running-Redis-as-a-Windows-Service<\/a>\nfrom flask import Flask\napp = Flask(__name__)\n# Make the WSGI interface available at the top level so wfastcgi can get it.\nwsgi_app = app.wsgi_app\nfrom routes import *\nif __name__ == '__main__':\n\u00a0\u00a0\u00a0 import os\n\u00a0\u00a0\u00a0 HOST = os.environ.get('SERVER_HOST', 'localhost')\n\u00a0\u00a0\u00a0 try:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PORT = int(os.environ.get('SERVER_PORT', '5555'))\n\u00a0\u00a0\u00a0 except ValueError:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PORT = 5555\n\u00a0\u00a0\u00a0 app.run(HOST, PORT)\n<\/pre>\n<p>Die Hauptlogik steckt in der <span style=\"color: #3366ff;\"><strong><span style=\"font-size: small;\">routes.py<\/span><\/strong><\/span><\/p>\n<pre>from flask import Flask, request, render_template, url_for\nfrom app import app;\nimport redis;<\/pre>\n<pre># Verbinde zu redis\nr = redis.StrictRedis(host='localhost',port=6379,db=0, charset=\"utf-8\", decode_responses = True);<\/pre>\n<pre>@app.route('\/')\ndef hello():\n\u00a0\u00a0\u00a0 url = url_for('submit');\n\u00a0\u00a0\u00a0 link = '&lt;a href=\"' + url + '\"&gt;Submit Question!&lt;\/a&gt;';\n\u00a0\u00a0\u00a0 return link;<\/pre>\n<pre>@app.route('\/about')\ndef about():\n\u00a0\u00a0\u00a0 # return 'We are the knights who say Ni!!';\n\u00a0\u00a0\u00a0 return \"\"\"&lt;html&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;head&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;title&gt; Hallo Welt!&lt;\/title&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/head&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;body&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;h1&gt;Hallo Andreas!&lt;\/h1&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/body&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/html&gt;\"\"\"<\/pre>\n<pre>@app.route('\/question\/&lt;title&gt;', methods=['GET', 'POST'])\ndef question(title):\n\u00a0\u00a0\u00a0 if request.method == 'GET':\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Redis code to load question\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # sende leeres Formular\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 question = r.get(title+':question')\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return render_template('AnswerQuestion.html', question = question)\n\u00a0\u00a0\u00a0 elif request.method == 'POST':\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 submittedAnswer = request.form['submittedAnswer'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Redis code to load answer\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 answer = r.get(title+':answer')\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if submittedAnswer == answer:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 #return \"Korrekt!\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return render_template('Correct.html');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return render_template('Incorrect.html', answer = answer, submittedAnswer = submittedAnswer);<\/pre>\n<pre>@app.route('\/submit', methods=['GET', 'POST'])\ndef submit():\n\u00a0\u00a0\u00a0 if request.method == 'GET':\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return render_template('CreateQuestion.html');\n\u00a0\u00a0\u00a0 elif request.method == 'POST':\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Daten einlesen\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 question = request.form['question'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 answer = request.form['answer'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 title = request.form['title'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Daten speichern\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 # Redis code to save question and answer\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 r.set(title +':question', question)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 r.set(title +':answer', answer)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return render_template('CreatedQuestion.html', question = question);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0 else: \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return \"&lt;h2&gt;Falscher Requst&lt;\/h2&gt; \";<\/pre>\n<p>Schliesslich braucht es die Html-Templates.<\/p>\n<p><span style=\"color: #3366ff;\"><strong><span style=\"font-size: small;\">CreateQuestion.html<\/span><\/strong><\/span><\/p>\n<pre>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\" xmlns=\"<a href=\"http:\/\/www.w3.org\/1999\/xhtml&quot;\">http:\/\/www.w3.org\/1999\/xhtml\"<\/a>&gt;\n&lt;head&gt;\n\u00a0\u00a0\u00a0 &lt;meta charset=\"utf-8\" \/&gt;\n\u00a0\u00a0\u00a0 &lt;title&gt;&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\u00a0\u00a0\u00a0 &lt;div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Enter your question!\n\u00a0\u00a0\u00a0 &lt;\/div&gt;\n\u00a0\u00a0\u00a0 &lt;form method=\"post\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Title:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;input type=\"text\" name=\"title\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Question:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;input type=\"text\" name=\"question\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Answer:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;input type=\"text\" name=\"answer\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;button type=\"submit\"&gt;Save question&lt;\/button&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/div&gt;\n\u00a0\u00a0\u00a0 &lt;\/form&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n<p><span style=\"font-size: small; color: #3366ff;\"><strong>CreatedQuestion.html<\/strong><\/span><\/p>\n<pre>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\" xmlns=\"<a href=\"http:\/\/www.w3.org\/1999\/xhtml&quot;\">http:\/\/www.w3.org\/1999\/xhtml\"<\/a>&gt;\n&lt;head&gt;\n\u00a0\u00a0\u00a0 &lt;meta charset=\"utf-8\" \/&gt;\n\u00a0\u00a0\u00a0 &lt;title&gt;Danke f\u00fcr deinen Eintrag&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\u00a0\u00a0\u00a0 &lt;h2&gt;Danke f\u00fcr deinen Eintrag.&lt;\/h2&gt;\n\u00a0\u00a0\u00a0 &lt;div&gt;Du hast gefragt: {{ question }}&lt;\/div&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n<p><span style=\"font-size: small; color: #3366ff;\"><strong>AnswerQuestion.html<\/strong><\/span><\/p>\n<pre>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\" xmlns=\"<a href=\"http:\/\/www.w3.org\/1999\/xhtml&quot;\">http:\/\/www.w3.org\/1999\/xhtml\"<\/a>&gt;\n&lt;head&gt;\n\u00a0\u00a0\u00a0 &lt;meta charset=\"utf-8\" \/&gt;\n\u00a0\u00a0\u00a0 &lt;title&gt;Bitte Frage beantworten&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\u00a0\u00a0\u00a0 &lt;h2&gt;Frage: {{ question }}&lt;\/h2&gt;\n\u00a0\u00a0\u00a0 &lt;form method=\"post\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;label for=\"answer\"&gt;Antwort:&lt;\/label&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;input type=\"text\" name=\"submittedAnswer\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;button type=\"submit\"&gt;Antwort schicken&lt;\/button&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/div&gt;\n\u00a0\u00a0\u00a0 &lt;\/form&gt;\n &lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n<p><span style=\"color: #3366ff;\">\u00a0<span style=\"font-size: small;\"><strong>Correct.html<\/strong><\/span><\/span><\/p>\n<pre>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\" xmlns=\"<a href=\"http:\/\/www.w3.org\/1999\/xhtml&quot;\">http:\/\/www.w3.org\/1999\/xhtml\"<\/a>&gt;\n&lt;head&gt;\n\u00a0\u00a0\u00a0 &lt;meta charset=\"utf-8\" \/&gt;\n\u00a0\u00a0\u00a0 &lt;title&gt;GGratulation!&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\u00a0\u00a0\u00a0 &lt;h2&gt;Gratulation, die Antwort ist richtig!&lt;\/h2&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n<p><span style=\"font-size: small; color: #3366ff;\"><strong>Incorrect.html<\/strong><\/span><\/p>\n<pre>&lt;!DOCTYPE html&gt;<\/pre>\n<pre>&lt;html lang=\"en\" xmlns=\"<a href=\"http:\/\/www.w3.org\/1999\/xhtml&quot;\">http:\/\/www.w3.org\/1999\/xhtml\"<\/a>&gt;\n&lt;head&gt;\n\u00a0\u00a0\u00a0 &lt;meta charset=\"utf-8\" \/&gt;\n\u00a0\u00a0\u00a0 &lt;title&gt;Sorry, die Antwort stimmt nicht&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\u00a0\u00a0\u00a0 &lt;h2&gt;Sorry, die Antwort stimmt nicht&lt;\/h2&gt;\n\u00a0\u00a0\u00a0 &lt;div&gt; Die richtige Antwort ist: {{ answer }} &lt;\/div&gt;\n\u00a0\u00a0\u00a0 &lt;div&gt; Du hast gesagt: {{ submittedAnswer }}\u00a0 &lt;\/div&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Eine erste Programmier\u00fcbung mit Flask, programmiert nach einem Kurs der Microsoft Virtual Academy\u00a0von Christopher Harrison und Susan Ibach (ihr Blog).\u00a0Weitere Kurse und Blogs zu Python, Flask gibt es bei Channel 9 (auch diesen Kurs und diesen inhaltlich \u00e4hnlichen mit Django) und Geektrainer. Eine Liste von Blogs und Youtube Filmen zu flask, Python \u00a0und bottle (eine [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[10],"tags":[51,102,108],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Democode: Hallo Welt Projekt mit Python\/Flask und Redis - Merkbar.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Democode: Hallo Welt Projekt mit Python\/Flask und Redis - Merkbar.\" \/>\n<meta property=\"og:description\" content=\"Eine erste Programmier\u00fcbung mit Flask, programmiert nach einem Kurs der Microsoft Virtual Academy\u00a0von Christopher Harrison und Susan Ibach (ihr Blog).\u00a0Weitere Kurse und Blogs zu Python, Flask gibt es bei Channel 9 (auch diesen Kurs und diesen inhaltlich \u00e4hnlichen mit Django) und Geektrainer. Eine Liste von Blogs und Youtube Filmen zu flask, Python \u00a0und bottle (eine [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/\" \/>\n<meta property=\"og:site_name\" content=\"Merkbar.\" \/>\n<meta property=\"article:published_time\" content=\"2016-06-03T20:51:35+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-1.png\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"wp_blogadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#website\",\"url\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/\",\"name\":\"Merkbar.\",\"description\":\"IT, Elektronik und Mathematik\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#primaryimage\",\"inLanguage\":\"de\",\"url\":\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-1.png\",\"contentUrl\":\"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-1.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#webpage\",\"url\":\"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/\",\"name\":\"Democode: Hallo Welt Projekt mit Python\/Flask und Redis - Merkbar.\",\"isPartOf\":{\"@id\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#primaryimage\"},\"datePublished\":\"2016-06-03T20:51:35+00:00\",\"dateModified\":\"2016-06-03T20:51:35+00:00\",\"author\":{\"@id\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\"},\"breadcrumb\":{\"@id\":\"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Democode: Hallo Welt Projekt mit Python\/Flask und Redis\"}]},{\"@type\":\"Person\",\"@id\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\",\"name\":\"wp_blogadmin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"caption\":\"wp_blogadmin\"},\"url\":\"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/author\/wp_blogadmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Democode: Hallo Welt Projekt mit Python\/Flask und Redis - Merkbar.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/","og_locale":"de_DE","og_type":"article","og_title":"Democode: Hallo Welt Projekt mit Python\/Flask und Redis - Merkbar.","og_description":"Eine erste Programmier\u00fcbung mit Flask, programmiert nach einem Kurs der Microsoft Virtual Academy\u00a0von Christopher Harrison und Susan Ibach (ihr Blog).\u00a0Weitere Kurse und Blogs zu Python, Flask gibt es bei Channel 9 (auch diesen Kurs und diesen inhaltlich \u00e4hnlichen mit Django) und Geektrainer. Eine Liste von Blogs und Youtube Filmen zu flask, Python \u00a0und bottle (eine [&hellip;]","og_url":"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/","og_site_name":"Merkbar.","article_published_time":"2016-06-03T20:51:35+00:00","og_image":[{"url":"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-1.png"}],"twitter_card":"summary","twitter_misc":{"Verfasst von":"wp_blogadmin","Gesch\u00e4tzte Lesezeit":"6 Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#website","url":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/","name":"Merkbar.","description":"IT, Elektronik und Mathematik","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"ImageObject","@id":"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#primaryimage","inLanguage":"de","url":"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-1.png","contentUrl":"http:\/\/wp.andreas.bieri.name\/wp-content\/uploads\/2016\/06\/mva-flask-1.png"},{"@type":"WebPage","@id":"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#webpage","url":"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/","name":"Democode: Hallo Welt Projekt mit Python\/Flask und Redis - Merkbar.","isPartOf":{"@id":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#primaryimage"},"datePublished":"2016-06-03T20:51:35+00:00","dateModified":"2016-06-03T20:51:35+00:00","author":{"@id":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d"},"breadcrumb":{"@id":"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/2016\/06\/03\/democode-hallo-welt-projekt-mit-pythonflask-und-redis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/"},{"@type":"ListItem","position":2,"name":"Democode: Hallo Welt Projekt mit Python\/Flask und Redis"}]},{"@type":"Person","@id":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d","name":"wp_blogadmin","image":{"@type":"ImageObject","@id":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/#personlogo","inLanguage":"de","url":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","caption":"wp_blogadmin"},"url":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/author\/wp_blogadmin\/"}]}},"_links":{"self":[{"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/posts\/1209"}],"collection":[{"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/comments?post=1209"}],"version-history":[{"count":0,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/posts\/1209\/revisions"}],"wp:attachment":[{"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/media?parent=1209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/categories?post=1209"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ec2-52-29-166-97.eu-central-1.compute.amazonaws.com\/myblog\/wp-json\/wp\/v2\/tags?post=1209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}