Есть ли способ передать все переменные в текущей области в Мако в качестве контекста? - PullRequest
2 голосов
/ 16 мая 2011

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

def index(self):
    title = "test"
    return render("index.html", title=title)

Где render - это функция, которая автоматически отображает данный файл шаблона, а остальные переменные передаются как его контекст. В этом случае я передаю title в качестве переменной в контексте. Это немного избыточно для меня. Можно ли как-нибудь автоматически выбрать все переменные, определенные в методе index, и передать их все как часть контекста в Mako?

Ответы [ 2 ]

2 голосов
/ 16 мая 2011

Используйте методику, приведенную ниже:

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 для метода.

0 голосов
/ 16 мая 2011

Посмотрите на этот фрагмент:

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

...