views:

41

answers:

3

I'm new to python and currently trying to use mako templating. I want to be able to take an html file and add a template to it from another html file. Let's say I got this index.html file:

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

and this name.html file:

world

(yes, it just has the word world inside). I want the ${name} in index.html to be replaced with the content of the name.html file. I've been able to do this without the name.html file, by stating in the render method what name is, using the following code:

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

This is obviously not useful for larger pieces of text. Now all I want is to simply load the text from name.html, but haven't yet found a way to do this. What should I try?

+1  A: 

Did I understand you correctly that all you want is read the content from a file? If you want to read the complete content use something like this (Python >= 2.5):

from __future__ import with_statement

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

Note: The from __future__ line has to be the first line in your .py file (or right after the content encoding specification that can be placed in the first line)

Or the old approach:

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

If your file contains non-ascii characters, you should also take a look at the codecs page :-)

Then, based on your example, the last section could look like this:

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)

You can find more details about the file object in the official documentation :-)

There is also a shortcut version:

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

But I personally prefer the long version with the explicit closing :-)

Horst Gutmann
+2  A: 
return mytemplate.render(name=open(<path-to-file>).read())
katrielalex
+1  A: 

Thanks for the replies.
The idea is to use the mako framework since it does things like cache and check if the file has been updated...

this code seems to eventually work:

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

Thanks again.

cschicka