Skip to main content
idego
Python

Integration von Mako in das Django 1.8 Template-Backend-Subsystem

Von Idego Group

Integration von Mako in das Django 1.8 Template-Backend-Subsystem

Django 1.8 führte Unterstützung für mehrere Template-Engines ein, eine bedeutende architektonische Änderung, die es Entwicklern ermöglichte, über die Standard-Django-Template-Sprache hinauszugehen. Die Funktion wurde durch eine Indiegogo-Kampagne von der Community finanziert und war eine Reaktion auf Leistungsbedenken bei komplexen Vorlagen.

Das neue Template-Backend-System erfordert die Implementierung einer benutzerdefinierten Klasse, die von BaseEngine erbt. Diese Klasse muss zwei Methoden bereitstellen: from_string() zum direkten Kompilieren von Template-Code und get_template() zum Laden von Templates nach Namen. Beide Methoden geben Template-Objekte mit einer render(context, request)-Signatur zurück.

Ein kritisches Implementierungsdetail betrifft die korrekte Handhabung der BaseEngine-Initialisierung. Die übergeordnete Klasse prüft, ob alle Konfigurationsparameter verbraucht wurden, sodass Entwickler das OPTIONS-Wörterbuch explizit kopieren und entfernen müssen, bevor sie den Superklassen-Konstruktor aufrufen.

Kontextprozessoren stellen eine weitere Überlegung dar. Im Gegensatz zur nativen Template-Engine von Django unterstützen alternative Backends wie Jinja2 und Mako Kontextprozessoren nicht nativ. Die Implementierung benutzerdefinierter Backends erfordert die manuelle Anwendung von Kontextprozessoren innerhalb der render-Methode des Template-Wrappers.

Die Mako-Implementierung demonstriert die Erstellung einer wiederverwendbaren Basisklasse, die andere Template-Backends erweitern können. Diese Basisklasse übernimmt die Anwendung von Kontextprozessoren und die OPTIONS-Extraktion, während sich spezifische Engine-Implementierungen auf die Engine-Initialisierung und Ausnahmeübersetzung konzentrieren.

Die Template-Auswahl wird etwas weniger effizient, wenn mehrere Backends konfiguriert sind, da Django jeden registrierten Backend durchsucht. Das django.template.loader-Modul bietet jedoch einen using-Parameter, der eine explizite Backend-Spezifikation ermöglicht und die erschöpfende Suche umgeht.

Verwandte Artikel