Mark Zeichenfolge als sicher in Mako
Frage
Ich bin mit Pylonen mit Mako-Vorlagen und ich mag die Eingabe das die ganze Zeit zu vermeiden:
${ h.some_function_that_outputs_html() | n }
Ich möchte irgendwie die Funktion zu markieren, oder eine Variable als sicher (Sie tun können, dass in Django), so habe ich nicht zu Rohr-en die ganze Zeit. Irgendwelche Ideen?
Lösung
ich gerade herausgefunden, dass, wenn Sie setzen ein html Methode in der Klasse, dann wird Mako rufen Sie diese Methode und Ausgang, was es in der Vorlage zurück.
So habe ich:
def __html__(self):
return unicode(self)
Das ist im Grunde, was h.literal der Fall ist.
Andere Tipps
Nach dem mako docs über Filterung , können Sie die Standardfilter-Set, das innerhalb Vorlagen angewandt, wenn auch für den Template
eine neue TemplateLookup
zu schaffen (in diesem Fall das für alle Vorlagen, die von Standard gelten würde, die es nach oben sieht), mit dem default_filters
Argumente.
Pylonen verwendet dieses Argument mit TemplateLookup
die Standardeinstellung für Ihr Projekt innerhalb der config/environment.py
-Datei festlegen:
# Create the Mako TemplateLookup, with the default auto-escaping
config['pylons.app_globals'].mako_lookup = TemplateLookup(
directories=paths['templates'],
error_handler=handle_mako_error,
module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
input_encoding='utf-8', default_filters=['escape'],
imports=['from webhelpers.html import escape'])
Dies ist, warum Sie das entweichende standardmäßig bekommen (was nicht der Fall ist, wenn Sie Mako selbst verwenden). So könnte man es entweder global ändern, in der Konfigurationsdatei, oder nicht auf dem Standard-Lookup verlassen. Beachten Sie, dass Sie sollten natürlich dann explizit einen Filter verwenden, um diese Dinge zu entkommen, die Flucht brauchen.
Sie können auch einen String übergeben „markiert als sicher“ mit der Pylonen Helfer h.literal
, zum Beispiel, wenn Sie h.literal('This will <b>not</b> be escaped')
auf die Vorlage passieren würden, sagen als Variable mit dem Namen spam
, die Sie gerade ${spam}
ohne Flucht nutzen könnten.
Wenn Sie den gleichen Effekt wünschen, wenn Sie aus dem Inneren einer Vorlage, um eine bestimmte Funktion aufrufen, würde diese Funktion zurückgeben müssen eine solche wörtliche oder bieten einen Helfer für diese Funktion, die h.literal
auf das Ergebnis ruft, wenn Sie das Original verlassen wollen Funktion allein. (Oder ich denke, man es auch über einen „Filtern von def“ nennen könnte (siehe gleichen Mako doc wie oben), nicht mit, dass noch experimentiert)