Есть ли способ передать все переменные в текущей области в Мако в качестве контекста?

У меня есть такой метод:

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переменные Я не думаю, что вы можете сделать это с помощью функции в реальном времени, но с классом это, кажется, работает.

Другие вопросы по тегам