Есть ли способ передать все переменные в текущей области в Мако в качестве контекста?
У меня есть такой метод:
def index(self):
title = "test"
return render("index.html", title=title)
куда render
это функция, которая автоматически отображает данный файл шаблона, а остальные переменные передаются в качестве контекста. В этом случае я прохожу title
в качестве переменной в контексте. Это немного избыточно для меня. Есть ли способ, которым я могу автоматически подобрать все переменные, определенные в index
метод и передать их все как часть контекста Мако?
2 ответа
Используйте технику, приведенную ниже:
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()
Когда вы запускаете вышеуказанный скрипт, он печатает
{'subject': 'A subject', 'title': 'A title'}
показывая, что vars
словарь может быть использован как шаблонный контекст, точно так же, как если бы вы сделали вызов следующим образом:
render("index.html", title='A title', subject='A subject')
Если вы используете locals()
, он будет передавать локальные переменные, определенные в теле index()
функция, а также любые параметры, переданные index()
- такие как self
для метода.
Посмотрите на этот фрагмент:
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)
Когда вы запускаете его, он выплевывает это:
a=b
__module__=__main__
e=f
c=d
foo=['bar', 'baz']
__doc__=None
locals()['bar']
кусок ссылается на класс bar
сам и vars()
возвращается bar
переменные Я не думаю, что вы можете сделать это с помощью функции в реальном времени, но с классом это, кажется, работает.