[PYTHON] Ich habe Jinja2 beim Lesen des Dokuments verglichen, um es mit Django zu verwenden

Dieser Artikel ist der 16. Tagesartikel des Django Adventskalenders 2016.

Was ist Jinja2?

Einfach gesagt, es ist eine Python-Template-Engine. Offizielle Seite: http://jinja.pocoo.org/ Inspiriert von Djangos Template-Engine sieht es genauso aus wie Djangos Standard-Template-Engine. Jinja2 ist funktionsreicher als die Vorlagen-Engine von Django und kann für andere Zwecke wie LaTex und E-Mail anstelle einer Vorlagen-Engine zum Schreiben von HTML und XML verwendet werden.

Offiziell unterstützt seit Django 1.8. (Installation der Bibliothek ist erforderlich)

Übrigens ist der Ursprung des Namens "Wenn Sie den Schrein ins Englische übersetzen, haben Tempel, Vorlage und Tempel ähnliche Aussprachen → Es scheint Jinja zu sein" w

Wie ich mich entschied zu untersuchen

Ich bin neu in Django, daher habe ich Jinja2 noch nie mit Django verwendet und gefragt, ob ich vorerst die Standardvorlagen-Engine verwenden soll. Ich habe es in Andere Verwendungen verwendet (es tut mir leid für meinen Artikel w), aber ich habe nichts Besonderes getan, deshalb habe ich die Dokumentation so oft gelesen. Es gibt keine solche Sache.

~~ Rails ist eher an die Entwicklung von Webframeworks gewöhnt als an Django, daher möchte ich Ruby Slim unbedingt verwenden. ~~ Es gibt eine bequemere Template-Engine, um die Entwicklung zu vereinfachen. Ich wollte es wenn möglich verwenden, also entschied ich mich diesmal, Jinja2 zu untersuchen und mich auf die Verwendung in Django zu konzentrieren.

Es scheint, dass Django auch eine schlanke Template-Engine hat, aber ich habe sie gestoppt, weil es nur wenige Informationen gibt und es schwierig zu sein scheint, nachzuschlagen.

** Dieser Artikel beschreibt nur Dinge, die mit Django zu tun haben, daher werde ich andere Verwendungszwecke nicht behandeln. ** **.

Ausführungsumgebung

Das Ersetzen der Django-Vorlage durch Jinja2 schien schwierig zu sein, daher habe ich diesmal nur einen kleinen Teil des vorhandenen Projekts durch einen Test ersetzt. Wie ich im nächsten Einführungsartikel schreiben werde, wurden die Standardvorlagen-Engine und Jinja2 in einem Projekt gemischt. ** Python 3.3 und höher scheint nicht vollständig unterstützt zu werden **, daher sollten Sie vorsichtig sein, wenn Sie 3.4 oder höher verwenden. Da der Test selbst bestanden wurde, werden es auch kleine Fehler sein, selbst wenn es Fehler gibt. http://jinja.pocoo.org/docs/dev/intro/#experimental-python-3-support

Einführung

Schreiben Sie TEMPLATE in Djangos settings.py wie folgt neu. Standardmäßig sucht Jinja2 im jinja2-Verzeichnis nach Vorlagendateien, sodass das Wechseln zu Jinja2 nur für "BACKEND" im normalen Zustand nicht funktioniert. Es scheint notwendig zu sein, den Namen des Vorlagenverzeichnisses jeder Anwendung in jinja2 zu ändern oder ihn explizit mit "DIRS" anzugeben. Im folgenden Beispiel wird die Jinja2-Einstellung zur üblichen (?) Einstellung hinzugefügt.

In meiner lokalen Entwicklungsumgebung habe ich django_debug_toolbar usw. eingefügt, aber um den Pfad zu den Vorlagen dieser Bibliotheken zu übergeben, musste ich auch die üblichen Vorlageneinstellungen vornehmen. In einer Produktionsumgebung werden diese Bibliotheken nicht verwendet, und es werden (wahrscheinlich) nur die von ihnen definierten Vorlagen verwendet, sodass anscheinend nur die Jinja2-Einstellungen ausreichen.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [os.path.join(BASE_DIR, 'templates/jinja2')],
        'APP_DIRS': True,
    },
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Unterschied zu Django

Die Dokumentation ist umfangreich, aber es gibt viele Teile, die für die Verwendung als Django-Vorlagen-Engine nicht relevant sind. Daher können Sie vorerst anhand der folgenden URL sehen, was Sie tun können. http://jinja.pocoo.org/docs/dev/templates/#synopsis

Obwohl es Django Inspire heißt, gibt es viele Unterschiede in den detaillierten Spezifikationen, daher werde ich nur die Hauptunterschiede vorstellen.

Unterschied in der Beschreibung beim Ausführen einer Methode

Mit JinJa2 können Sie die Verarbeitung wie Python sogar auf eine Vorlage schreiben. Wie unten gezeigt, hat Django nicht (), aber Jinja2 fügt () hinzu. Django: {% for page in user.get_created_pages %} Jinja2: {% for page in user.get_created_pages() %} Dank dessen ist es möglich, order_by auf der Vorlagenseite zum Django-Modell hinzuzufügen. Ich finde es jedoch nicht cool, eine solche Beschreibung auf der Vorlagenseite zusammenzufassen.

Makro

http://jinja.pocoo.org/docs/dev/templates/#macros Wenn Sie in Django etwas anderes als die von Anfang an für die Vorlage bereitgestellte Verarbeitung ausführen möchten, haben Sie wahrscheinlich Ihr eigenes Vorlagen-Tag definiert, aber in Jinja2 definieren Sie es mithilfe eines so genannten Makros. Das in der Vorlage definierte Makro kann per Aufruf wiederverwendet werden. Ich werde die Details weglassen w

Sie können verschiedene Operatoren und Filter verwenden (Vorlagen-Tags?)

http://jinja.pocoo.org/docs/dev/templates/#list-of-builtin-filters Es gibt überraschend viele Filter. Es ist ein Eindruck, dass Sie Methoden verwenden können oder haben, die für jedes der Python-Arrays, Zeichenfolgen und numerischen Objekte verwendet werden können.

http://jinja.pocoo.org/docs/dev/templates/#math Ich verwende django-mathfilter, wenn ich mit Django vier Regeln für eine Vorlage ausführen möchte, aber Jinja2 scheint sie nicht zu benötigen. Es ist nüchtern, aber ich bin glücklich. Es gibt auch viele Vergleichsoperatoren.

Es ist überwältigend einfacher als das Erstellen und Verwenden von Vorlagen-Tags selbst.

Umgang mit Variablen

Zum Beispiel, wenn Sie die folgenden Variablen in einer Vorlage anzeigen möchten

foo = {"bar": 1}

Für Djangos Standardvorlage

foo.bar

Daher können Sie nicht "foo [" bar "]" schreiben, aber im Fall von Jinja2 können Sie auch "foo [" bar "]" verwenden. Ich bin auch glücklich, weil es sich immer seltsam anfühlte, mit Punkten auf diktierte Variablen zuzugreifen.

Umgang mit globalen Variablen

http://qiita.com/ryu22e/items/e50f8a3fbd6fe836c1b4 Ich werde es nicht schreiben, weil einige Leute den Artikel bereits geschrieben haben. Ich denke, dass context_processor auf die Standardvorlagen-Engine von Django anwendbar ist, aber ich bin mir nicht sicher, ob die Möglichkeit, globale Variablen festzulegen, der Vorteil von Jinja2 ist, da ich es nie selbst gemacht habe.

Zusammenfassung

Es hat mehr Funktionen als ich erwartet hatte und es ist ein grober Artikel geworden.

Es ist sehr vielseitig und ich möchte es sofort verwenden, aber obwohl es Django Inspire heißt, gibt es viele kleine Unterschiede, und ich hatte den Eindruck, dass das Ersetzen eines vorhandenen Projekts durch Jinja2 etwas ärgerlich erscheint. Beim Umschalten auf Slim mit Rails gibt es einen Konvertierungsbefehl, so dass das Umschalten relativ einfach war, aber Jinja2 scheint unmöglich zu sein, wenn Sie nicht alles richtig überprüfen. Ich würde es gerne versuchen, wenn ich eine neue App erstelle.

Ich denke auch nicht, dass es gut ist, die Logik auf der Vorlagenseite zu stopfen oder die Daten überhaupt zu berühren, deshalb dachte ich, dass ich bei der Verwendung von Jinja2 besonders vorsichtig sein musste. Das gleiche steht im Dokument. http://jinja.pocoo.org/docs/dev/faq/#isn-t-it-a-terrible-idea-to-put-logic-into-templates

Recommended Posts

Ich habe Jinja2 beim Lesen des Dokuments verglichen, um es mit Django zu verwenden
[Python] Ich möchte die Option -h mit argparse verwenden
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Ich möchte die Django Debug Toolbar in Ajax-Anwendungen verwenden
Ich habe den JWT-Token-Generator mit Django Rest Auth auf SimpleJWT geändert.
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Der einfachste Weg, um mit Django zu beginnen
Ich möchte MATLAB feval mit Python verwenden
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Geben Sie die ausführbare Python-Datei an, die mit virtualenv verwendet werden soll
Ich wollte mit der Bezier-Kurve spielen
Der einfachste Weg, OpenCV mit Python zu verwenden
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte -inf nicht mit np.log verwenden
Ich möchte ip vrf mit SONiC verwenden
Ich möchte die Aktivierungsfunktion Mish verwenden
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich möchte in der Django-Verschiebungstabelle scrollen, aber ...
Verwenden Sie Gentelella mit Django
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich möchte mit Python-Datenklasse nach hinten erben
Geben Sie MinGW als den in Python verwendeten Compiler an
Verwenden Sie WENIGER mit Django
Übergang zum Update-Bildschirm mit dem Django-Tag
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich wollte nur die Daten des gewünschten Datums und der gewünschten Uhrzeit mit Django extrahieren
Ich möchte R-Datensatz mit Python verwenden
Ich habe dir geschrieben, dass du das Signal mit Go sehen sollst
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich möchte das neueste gcc verwenden, auch wenn ich keine Sudo-Berechtigungen habe! !!
Ich möchte R-Funktionen einfach mit ipython notebook verwenden
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich wollte den Panasonic Programming Contest 2020 mit Python lösen
Warum kann ich das Modul durch Importieren mit Python verwenden?
Es war zu einfach, eine vorhandene Datenbank mit Django zu verwenden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte mit Numpy die japanische Flagge in die Palau-Flagge ändern
Wenn Sie wissen, wie Jinja2 verwendet wird, wird die Entwicklung mit Flask intelligenter
Ich habe es beim Versuch bemerkt, Ninix-Aya mit Docker auszuführen (Teil 3).
Ich möchte eine virtuelle Umgebung mit Jupyter Notebook verwenden!
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
Ich habe das Toho-Projekt mit Deep Learning aufgenommen ... ich wollte.
Ich habe versucht zusammenzufassen, wie das EPEL-Repository erneut verwendet wird
Ich habe Klinge und Jinja2 verglichen
Verwenden Sie prefetch_related bequem mit Django
Um die Veröffentlichung von Django 3.0 zu feiern, habe ich ASGI, den spirituellen Nachfolger von WSGI, ausprobiert, aber der Web-Socket hat nicht funktioniert.
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Wiederholen Sie mit While. Skript zum Twittern oder Suchen vom Terminal aus
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ich möchte das Wetter mit LINE bot feat.Heroku + Python wissen
[Version September 2020] Erläutert das Verfahren zur Verwendung der Google Mail-API mit Python