2010-08-19 55 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.html文件的内容替换index.html中的${name}。 我已经能够做到这一点没有name.html文件,通过陈述在Render方法什么名字,使用下面的代码:

@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
return mytemplate.render(name=open(<path-to-file>).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) 

感谢。