Skip to main content
idego
Python

Integrera Mako med Django 1.8 Template-Backend-Subsystemet

Av Idego Group

Integrera Mako med Django 1.8 Template-Backend-Subsystemet

Django 1.8 introducerade stöd för flera mallmotorer, en betydande arkitektonisk förändring som lät utvecklare gå bortom standardspråket Django Template Language. Funktionen finansierades av communityn via en Indiegogo-kampanj och representerade ett svar på prestandaproblem med komplexa mallar.

Det nya mall-backend-systemet kräver implementering av en anpassad klass som ärver från BaseEngine. Denna klass måste tillhandahålla två metoder: from_string() för att kompilera mallkod direkt och get_template() för att ladda mallar efter namn. Båda metoderna returnerar Template-objekt med en render(context, request)-signatur.

En kritisk implementeringsdetalj handlar om att korrekt hantera BaseEngine-initialiseringen. Förälderklassen validerar att alla konfigurationsparametrar förbrukas, så utvecklare måste explicit kopiera och ta bort OPTIONS-ordboken innan de anropar superklassens konstruktor.

Kontextprocessorer utgör ytterligare en övervägning. Till skillnad från Djangos inbyggda mallmotor stöder alternativa backends som Jinja2 och Mako inte kontextprocessorer inbyggt. Implementering av anpassade backends kräver manuell tillämpning av kontextprocessorer inom mallomslutningens render-metod.

Mako-implementeringen demonstrerar skapandet av en återanvändbar basklass som andra mall-backends kan utöka. Denna basklass hanterar kontextprocessortillämpning och OPTIONS-extraktion, medan specifika motorimplementeringar fokuserar på motorinitialisering och undantagsöversättning.

Mallval blir något mindre effektivt när flera backends är konfigurerade, eftersom Django genomsöker varje registrerad backend. Men django.template.loader-modulen tillhandahåller en using-parameter som möjliggör explicit backend-specifikation och kringgår den uttömmande sökningen.

Relaterade artiklar