2009-12-01 12 views
11

Ich bin Pylons mit Mako-Vorlagen verwenden und ich möchte die Zeit der Eingabe dieses alles zu vermeiden:Mark Zeichenfolge als sicher in Mako

${ h.some_function_that_outputs_html() | n } 

ich markieren, um irgendwie die Funktion oder eine Variable als sicher wollen (Sie das kann ich in Django), also muss ich nicht ständig pumpen. Irgendwelche Ideen?

Antwort

10

Ich habe gerade herausgefunden, dass, wenn Sie setzen einen html Methode in Ihre Klasse, dann wird Mako nur diese Methode aufrufen und ausgeben, was auch immer sie in der Vorlage zurückgibt.

Also habe ich:

def __html__(self): 
    return unicode(self) 

Das ist im Grunde, was h.literal tut.

+0

Dies muss in die "Klasse" gehen, die von 'h.some_function_that_outputs_html()' zurückgegeben wird, nehme ich an. – Felix

3

Nach dem mako docs about filtering, können Sie die Standardfilter festlegen, die innerhalb Vorlagen angewendet werden, wenn eine neue Template sowie für die TemplateLookup zu schaffen (in diesem Fall dies standardmäßig gelten würde für alle Vorlagen, die es schaut nach oben), mit dem default_filters Argument.

Pylonen verwendet dieses Argument mit TemplateLookup die Standardeinstellungen für Ihr Projekt zu setzen in der config/environment.py Datei:

# 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']) 

diesem Grund sollten Sie die Flucht standardmäßig bekommen (was nicht der Fall ist, wenn Sie selbst Mako verwenden). Sie können es also entweder global in der Konfigurationsdatei ändern oder sich nicht auf die Standardsuche verlassen. Beachten Sie, dass Sie dann natürlich explizit einen Filter verwenden sollten, um den Dingen zu entkommen, die es zu umgehen gilt.

Sie können auch mit dem Pylonen Helfer h.literal, zum Beispiel eine Zeichenfolge „sicher sind“ übergeben, wenn Sie h.literal('This will <b>not</b> be escaped') an der Vorlage, sagen als Variable spam genannt passieren würde, könnte man einfach ${spam} ohne Entkommen verwenden.

Wenn Sie beim Aufruf einer bestimmten Funktion innerhalb einer Vorlage den gleichen Effekt erzielen möchten, muss diese Funktion ein solches Literal zurückgeben oder einen Helfer für diese Funktion bereitstellen, die das Ergebnisaufruft, wenn Sie die Funktion verlassen möchten ursprüngliche 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)

+0

Danke, das funktionierte für mich – disc0dancer

+0

Nur eine Nachricht für Leute mit der ersten Lösung (Entfernen von Flucht aus default_filters) - Sie müssen Cache (rm -r Daten/Templates/*) löschen, um es funktioniert zu sehen (Ich habe gerade etwas ausgegeben frage mich, was los ist). – zefciu