Gibt es eine Möglichkeit, alle Variablen im aktuellen Bereich als Kontext an Mako zu übergeben?

StackOverflow https://stackoverflow.com/questions/6013539

  •  14-11-2019
  •  | 
  •  

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?

War es hilfreich?

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 bars-Variablen.Ich glaube nicht, dass man das mit einer Funktion in Echtzeit machen kann, aber mit einer Klasse scheint es zu funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top