2010-08-19 2 views
2

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

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

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

world 

(да, это просто есть слово мир внутри). Я хочу, чтобы ${name} в 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, но пока не нашел способ сделать это. Что я должен попробовать?

ответ

1

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

from __future__ import with_statement 

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

Примечание: От __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 object в официальной документации :-)

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

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

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

2

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

этот код, кажется, в конце концов, работа:

@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) 

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

Смежные вопросы