Gibt es eine Möglichkeit, alle Variablen im aktuellen Bereich als Kontext an Mako zu übergeben?
Frage
Ich habe eine Methode wie diese:
def index(self):
title = "test"
return render("index.html", title=title)
Wo render
ist eine Funktion, die die angegebene Vorlagendatei automatisch mit den restlichen Variablen rendert, die als Kontext übergeben werden.In diesem Fall gehe ich vorbei title
in als Variable im Kontext.Das ist für mich etwas überflüssig.Gibt es eine Möglichkeit, alle in der definierten Variablen automatisch abzurufen? index
Methode und übergeben Sie sie alle als Teil des Kontexts an Mako?
Lösung
Verwenden Sie die unten angegebene Technik:
def render(template, **vars):
# In practice this would render a template
print(vars)
def index():
title = 'A title'
subject = 'A subject'
render("index.html", **locals())
if __name__ == '__main__':
index()
Wenn Sie das obige Skript ausführen, wird es gedruckt
{'subject': 'A subject', 'title': 'A title'}
zeigt, dass die vars
dictionary könnte als Vorlagenkontext verwendet werden, genau so, als ob Sie den Aufruf so getätigt hätten:
render("index.html", title='A title', subject='A subject')
Wenn du benutzt locals()
, werden lokale Variablen übergeben, die im Hauptteil von definiert sind index()
Funktion sowie alle an übergebenen Parameter index()
- wie zum Beispiel self
für eine Methode.
Andere Tipps
Schauen Sie sich diesen Ausschnitt an:
def foo():
class bar:
a = 'b'
c = 'd'
e = 'f'
foo = ['bar', 'baz']
return vars(locals()['bar'])
for var, val in foo().items():
print var + '=' + str(val)
Wenn Sie es ausführen, spuckt es Folgendes aus:
a=b
__module__=__main__
e=f
c=d
foo=['bar', 'baz']
__doc__=None
Der locals()['bar']
chunk verweist auf die Klasse bar
selbst, und vars()
kehrt zurück bar
s-Variablen.Ich glaube nicht, dass man das mit einer Funktion in Echtzeit machen kann, aber mit einer Klasse scheint es zu funktionieren.