Загрузка шаблонов мако из файлов - PullRequest
2 голосов
/ 19 августа 2010

Я новичок в python и сейчас пытаюсь использовать мако-шаблоны. Я хочу иметь возможность взять HTML-файл и добавить шаблон к нему из другого HTML-файла. Допустим, я получил этот index.html файл:

<html>
<head>
  <title>Hello</title>
</head>
<body>    
    <p>Hello, ${name}!</p>
</body>
</html>

и этот name.html файл:

world

(да, в нем просто слово "мир"). Я хочу, чтобы ${name} in index.html был заменен содержимым файла name.html. Я смог сделать это без файла name.html, указав в методе рендеринга, какое имя, используя следующий код:

@route(':filename')
def static_file(filename):    
    mylookup = TemplateLookup(directories=['html'])
    mytemplate = mylookup.get_template('hello/index.html')
    return mytemplate.render(name='world')

Это явно бесполезно для больших фрагментов текста. Теперь все, что я хочу, это просто загрузить текст из name.html, но пока не нашел способ сделать это. Что мне попробовать?

Ответы [ 3 ]

2 голосов
/ 19 августа 2010
return mytemplate.render(name=open(<path-to-file>).read())
2 голосов
/ 19 августа 2010

Спасибо за ответы.
Идея состоит в том, чтобы использовать инфраструктуру mako, поскольку она выполняет такие функции, как кеширование, и проверяет, был ли файл обновлен ...

кажется, что этот код в итоге работает:

@route(':filename')
def static_file(filename):    
    mylookup = TemplateLookup(directories=['.'])
    mytemplate = mylookup.get_template('index.html')
    temp = mylookup.get_template('name.html').render()
    return mytemplate.render(name=temp)

Еще раз спасибо.

1 голос
/ 19 августа 2010

Правильно ли я вас понял, что вам нужно только прочитать содержимое из файла? Если вы хотите прочитать весь контент, используйте что-то вроде этого (Python> = 2.5):

from __future__ import with_statement

with open(my_file_name, 'r') as fp:
    content = fp.read()

Примечание: Строка from __future__ должна быть первой строкой в ​​вашем файле .py (или сразу после спецификации кодирования содержимого, которую можно поместить в первую строку)

Или старый подход:

fp = open(my_file_name, 'r')
try:
    content = fp.read()
finally:
    fp.close()

Если ваш файл содержит не-ascii символы, вам также следует взглянуть на страницу кодеков: -)

Тогда, на основе вашего примера, последний раздел может выглядеть так:

from __future__ import with_statement

@route(':filename')
def static_file(filename):    
    mylookup = TemplateLookup(directories=['html'])
    mytemplate = mylookup.get_template('hello/index.html')
    content = ''
    with open('name.html', 'r') as fp:
        content = fp.read()
    return mytemplate.render(name=content)

Более подробную информацию об объекте file можно найти в официальной документации: -)

Существует также версия ярлыка:

content = open('name.html').read()

Но лично я предпочитаю длинную версию с явным закрытием: -)

...