Obwohl Linux als freie Software kostenlos verfügbar ist, setzen viele beim Unternehmenseinsatz auf Enterprise-Distributionen mit Support. Wo die Stärken der ... (mehr)

Templates

Die schlechte alte Zeit, in der Webseiten noch mit Print-Statements ausgegeben wurden, sollten längst der Vergangenheit angehören. Die alte Praxis führt nicht nur zu unwartbarem Code, sondern öffnet typischerweise auch leicht Sicherheitslücken. Die Alternative dazu ist in Templates zu finden, die Code und Präsentation trennen. Mit Flask und der Jinja2-Bibliothek gelingt dies in einer Zeile:

render_template("homepage.html")

Weil sich hiermit nur eine statische Seite ausliefern ließe, verarbeitet »render_template« selbstverständlich auch die Übergabe von Variablen, die das Template mit »{{ Variable }}« ausgibt. Darüber hinaus gibt es auch Kontrollstrukturen, etwa For-Loops, die über Sequenzen iterieren ( Listing 2 ). Diese sind in »{%« und »%}« , aber die Syntax lässt sich auf Wunsch auch verändern. Enthält eine Variable HTML-Code, maskiert Jinja2 sie automatisch vor der Ausgabe – wieder eine Maßnahme gegen das ungewollte Einschleusen von Exploit-Code. Wer sich der Inhalte einer Variable sicher ist, kann dieses Verhalten aber auch von Hand verhindern.

Listing 2

Template

 

Besonders interessant ist, dass die Templates auch Vererbung unterstützen. Somit lassen sich gemeinsame Elemente aller Webseiten in ein Basis-Template auslagern, von dem sich alle anderen Templates ableiten. Hierbei kann das Basis-Template Default-Blocks definieren, die davon abgeleitete Templates mit jeweils eigenene Inhalten "überschreiben". Alternativ dazu können Templates andere Templates einbinden, womit sich die Webseite ebenfalls modular strukturieren lässt.

Variablen

Damit aus statischen HTML-Seiten auch Webanwendungen werden, müssen sie dynamisch auf Benutzereingaben reagieren, die der Webbrowser mit GET- oder POST-Requests übermittelt. Folgt etwa hinter dem Verzeichnis für die Blog-Einträge eine ID, kann Flask sie im folgenden Code-Block weiterverarbeiten:

@app.route('/blog/<blog_id>')
def show_blog(blog_id):
    render_template("blog.html", post_id)

Ergänzend dazu darf man die Variable auch direkt von einem String in einen anderen Typ umwandeln, etwa in einen Integer-Wert: »<int:blog_id>« .

Um an die Variablen zu kommen, die zum Beispiel beim Abschicken eines HTML-Formulars per POST übermittelt werden, bietet Flask den Zugriff auf das HTTP-Request-Objekt, das die Anweisung »from flask import request« ins Skript importiert. Über das Python-Dictionary »form« des Requests-Objekts finden Sie dann die Form-Variablen:

login = request.form['login']

Wird die Variable nicht gefunden, erzeugt die Methode ein Exception vom Typ »KeyError« . Kümmert man sich nicht selbst um diesen Fehler, gibt die Webanwendung einen HTTP-Fehler 400 "Bad Request" aus.

Um Variablen von einem Request zum nächsten zu speichern, bietet Flask ein Session-Objekt an, das ebenfalls wie ein Python-Dictionary funktioniert. Aus Sicherheitsgründen ist es hierbei wichtig, auf einen sicheren (das heißt möglichst zufälligen) Schlüssel zu achten, mit dem die Sessions signiert werden.

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023