Sichere dynamische Templates mit Jinja2 generieren

FlaskFlaskBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Das Generieren von HTML aus Python heraus ist nicht Spaß und tatsächlich ziemlich umständlich, da Sie selbst die HTML-Umwandlung mit escape vornehmen müssen, um die Anwendung sicher zu halten. Aus diesem Grund konfiguriert Flask das Jinja2-Template-Engine automatisch für Sie. Mit Templates können beliebige Textdateien generiert werden. Bei Webanwendungen werden Sie hauptsächlich HTML-Seiten generieren, können aber auch Markdown, einfachen Text für E-Mails und alles andere erzeugen.

In diesem Lab werden wir lernen, wie das Jinja2-Template-Engine verwendet wird, um sichere und dynamische Templates zu generieren.

Templates mit Jinja2 rendern

In diesem Schritt implementieren Sie die Template-Rendering mit dem Jinja2-Template-Engine.

  1. Öffnen Sie die Datei rendering_templates.py und importieren Sie zunächst die Flask-Klasse und render_template. Erstellen Sie dann eine Instanz der Flask-Klasse.
from flask import Flask, render_template
app = Flask(__name__)
  1. Als Nächstes verwenden wir den route()-Decorator, um zwei Routen, / und /<name>, zu erstellen, um eine einzige View-Funktion namens hello zu teilen. Um ein Template zu rendern, können Sie die render_template()-Methode verwenden. Sie wird von Flask bereitgestellt, um Templates mit dem Jinja2-Template-Engine zu rendern. Alles, was Sie tun müssen, ist, den Namen des Templates und die Variablen anzugeben, die Sie als Schlüsselwortargumente an das Template-Engine übergeben möchten. In der View-Funktion verwenden wir die render_template()-Methode, um das Template hello.html mit einer Variable namens name zu rendern.
@app.route('/')
@app.route('/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)
  1. Erstellen Sie einen main-Eintrittspunkt des Skripts, um die Flask-Anwendung auf einem Port (z.B. port=5000) zu starten. Aktivieren Sie dann den debug-Modus.
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. Flask sucht standardmäßig nach Templates im templates-Ordner. Wir müssen daher einen Ordner namens templates erstellen und die Datei hello.html unter diesem Ordner erstellen. Wir können den erforderlichen Ordner und die Datei erstellen, indem wir den folgenden Befehl im Terminal ausführen.
cd ~/project
mkdir templates
cd templates
touch hello.html
  1. Öffnen Sie die Datei templates/hello.html und schreiben Sie den folgenden Code:
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}

Der obige Code verwendet den bedingten Block in Jinja2. Es wird überprüft, ob die Variable name wahrheitsfähig ist (nicht None oder leer). Wenn ja, wird der Inhalt Hello {{ name }}! angezeigt. Andernfalls wird der Inhalt Hello, World! angezeigt.

  1. Um die Anwendung auszuführen, verwenden Sie zunächst die folgenden Befehle, um die Flask-Anwendung im Terminal zu starten:
cd ~/project
python3 rendering_templates.py
  1. Öffnen Sie dann die Registerkarte "Web 5000" oben in der Schnittstelle und aktualisieren Sie die Schnittstelle. Dann sollten Sie sehen, dass die Seite Hello, World! anzeigt.
Flask application output
Flask application running output
  1. Für die Route /<name> können Sie direkt einen Suffix in der Adressleiste oben hinzufügen. Beispielsweise ist unten ein Suffix flask in der Adressleiste mit Port 5000 eingegeben, und es zeigt Hello, flask! als Ausgabe an.

Flask route name example
Sie können verschiedene /<name>-Pfade in die Adressleiste eingeben, die Ausgabe wird entsprechend geändert.

Zusammenfassung

In diesem Lab haben wir gelernt, wie wir unsere Templates mit dem Jinja2-Template-Engine mithilfe der render_template()-Methode rendern. Diese Methode rendert nicht nur Templates lebendig, sondern ermöglicht auch die automatische Entitätssetzung, was dazu beiträgt, potenzielle XSS-Angriffe zu verhindern.