Im ersten Teil dieser dreiteiligen Übungsreihe haben wir gesehen, wie Sie die Vorlagenstruktur in einer auf Flask basierenden Anwendung mit Jinja2 gestalten. Wir haben auch gesehen, wie Blöcke verwendet werden können, um die Vererbung in Vorlagen zu nutzen. In diesem Teil wird beschrieben, wie Sie einen benutzerdefinierten Filter, einen benutzerdefinierten Kontextprozessor und ein Makro schreiben.
Ich werde auf der Kataloganwendung aufbauen, die wir im ersten Teil dieser Serie erstellt haben. Zuerst füge ich einen benutzerdefinierten Jinja2-Kontextprozessor hinzu, um einen beschreibenden Namen für jedes Produkt anzuzeigen. Dann werde ich einen benutzerdefinierten Jinja2-Filter erstellen, um dieselbe Aufgabe wie der benutzerdefinierte Kontextprozessor auszuführen. Anschließend werde ich zeigen, wie Sie ein benutzerdefiniertes Jinja2-Makro für reguläre Formularfelder erstellen.
Manchmal möchten wir einen Wert direkt in den Vorlagen berechnen oder verarbeiten. Jinja2 vertritt die Auffassung, dass die Verarbeitung von Logik in Ansichten und nicht in Vorlagen behandelt werden sollte. Dadurch bleiben die Vorlagen sauber. Ein Kontextprozessor wird in diesem Fall zu einem praktischen Werkzeug. Wir können unsere Werte an eine Methode übergeben; Dieser wird dann in einer Python-Methode verarbeitet und unser resultierender Wert wird zurückgegeben. Daher fügen wir im Wesentlichen nur eine Funktion zum Vorlagenkontext hinzu (dank Python, der es uns erlaubt, Funktionen wie jedes andere Objekt zu übergeben)..
Nehmen wir an, wir möchten für jedes Produkt einen beschreibenden Namen im Format hinzufügen Kategorie / Produktname
. Dazu muss eine Methode hinzugefügt werden, die es sein muss verziert mit @ app.context_prozessor
.
@ app.context_processor def some_processor (): def full_name (product): Rückgabe '0 / 1'. Format (product ['category'], product ['name']) return 'full_name': full_name
Technisch gesehen ist ein Kontext nur ein Python-Wörterbuch, das zum Hinzufügen und Entfernen von Werten geändert werden kann. Jede Methode mit dem angegebenen Dekorator sollte ein Wörterbuch zurückgeben, das den aktuellen Anwendungskontext aktualisiert.
Um diesen Kontextprozessor zu verwenden, fügen Sie einfach das folgende Jinja2-Tag in die Vorlage ein.
vollständiger_name (produkt)
Wenn wir das hinzufügen flask_app / templates / product.html
von unserer Anwendung würde es so aussehen:
% erweitert 'home.html'% % Blockcontainer%% endblock%vollständiger_name (produkt)
Produktname'] Produktkategorie']
$ product ['price']
Die resultierende Produktseite würde jetzt so aussehen:
Erfahrene Entwickler könnten nach Betrachtung des obigen Beispiels denken, dass es dumm war, zu diesem Zweck einen Kontextprozessor zu verwenden. Man kann einfach einen Filter schreiben, um das gleiche Ergebnis zu erhalten; Das wird die Dinge viel sauberer machen. Ein Filter kann geschrieben werden, um den beschreibenden Namen des Produkts anzuzeigen (siehe unten).
@ app.template_filter ('full_name') def full_name_filter (product): Rückgabe von '0 / 1'. format (product ['category'], product ['name'])
Dieser Filter kann wie ein normaler Filter verwendet werden, d. H. Durch Hinzufügen von a | (Rohr)
Symbol und dann den Filternamen.
product | full_name
Der obige Filter würde dasselbe Ergebnis liefern, wie der Kontextprozessor vor einiger Zeit gezeigt hat.
Um die Dinge auf eine höhere Ebene zu bringen, erstellen wir einen Filter, der die Währung basierend auf der lokalen Sprache des aktuellen Browsers formatiert. Dazu müssen wir zuerst ein Python-Paket mit dem Namen installieren ccy
.
$ pip install ccy
Jetzt müssen wir eine Methode für den Währungsfilter hinzufügen.
ccy from flask import import request @ app.template_filter ('format_currency') def format_currency_filter (Anzahl): Währungscode = ccy.countryccy (request.accept_languages.best [-2:]) Rückgabe '0 1' Währungscode Betrag)
Um diesen Filter verwenden zu können, müssen wir in unserer Vorlage Folgendes hinzufügen:
product ['price'] | format_currency
Nun würde die Produktseite aussehen:
Mithilfe von Makros können Sie wiederverwendbare Teile von HTML-Blöcken schreiben. Sie sind analog zu Funktionen in normalen Programmiersprachen. Wir können Argumente wie Makros an Funktionen in Python übergeben und sie dann zur Verarbeitung des HTML-Blocks verwenden. Makros können beliebig oft aufgerufen werden und die Ausgabe variiert je nach Logik. Das Arbeiten mit Makros in Jinja2 ist ein sehr verbreitetes Thema und hat viele Anwendungsfälle. Wir werden hier nur sehen, wie ein Makro erstellt und nach dem Import verwendet werden kann.
Eine der am meisten überflüssigen Codes in HTML ist die Definition von Eingabefeldern in Formularen. Die meisten Felder haben einen ähnlichen Code mit einigen Stiländerungen und so weiter. Das Folgende ist ein Makro, das beim Aufruf Eingabefelder erstellt. Es empfiehlt sich, das Makro zur besseren Wiederverwendbarkeit in einer separaten Datei zu erstellen, _helpers.html
:
% macro render_field (name ,, type = "text") -% % - endmacro%
Nun sollte dieses Makro in die zu verwendende Datei importiert werden:
% from '_helpers.jinja' import render_field%
Dann kann es einfach mit folgendem aufgerufen werden:
Es ist immer ratsam, Makros in einer anderen Datei zu definieren, um den Code sauber zu halten und die Lesbarkeit des Codes zu verbessern. Wenn ein privates Makro benötigt wird, auf das nicht aus der aktuellen Datei zugegriffen werden kann, benennen Sie das Makro mit einem Unterstrich vor dem Namen.
In diesem Lernprogramm haben wir gesehen, wie Sie einen benutzerdefinierten Filter, einen benutzerdefinierten Kontextprozessor und ein benutzerdefiniertes Makro für Formulare erstellen. Im nächsten Teil dieser Serie erfahren Sie, wie Sie in Jinja2 mithilfe von moment.js eine erweiterte Formatierung von Datum und Uhrzeit auf Vorlagenebene implementieren.