Skip to main content

Python: Mako

There's a new Python templating engine called Mako. It's basically a modern, more-Pythonic version of Myghty, which is a Python version of Mason. It makes sense to switch if you're already using Myghty. It also makes sense to use if you're a Python guy who wants to avoid learning something new and just wants to dump a bit of Python in the middle of some HTML.

I like Mike Bayer, Mako's author, but I prefer Genshi. Nonetheless, if Mike wants to go out and write another templating engine, more power to him!

However, my feeling is that Python needs another templating engine like I need another open source kernel!
<sarcasm>Yeah, thanks a lot Apple! Sure, Darwin's great! Too bad I can't use my airport card!</sarcasm>
Seriously, I'd be a lot happier if they kept Darwin and released Cocoa. Now, that would be progress.

*sigh* ;)

Comments

Ben Bangert said…
The other bit worth mentioning is that Mako is 10-16x faster than Genshi and about 4-7x faster than Myghty/Django. If you need speed, this definitely matters. While not everyone needs such speed, certain apps that are expected to have high loads and can't be cached definitely benefit from this.

I think its great that there's an excellent choice for XML-based templating (Genshi), and hope that Mako will be the cream of the crop for non-XML templating. There's certainly room for excellence in both categories, and I think Mako has a significantly more elegant feel to it than Cheetah has ever given me.
mike bayer said…
we know you prefer Genshi, but I know that you *love* those component-calls-with-content too :). Mako adds some new twists on them Myghty never had.
Anonymous said…
so JJ, what is it about Genshi that you prefer over Mako? Is it only the well-formed XML? Curious minds want to know.

(I'm now happy that I never bothered much to learn Genshi, since Mako seems to gel better with my brain... But maybe if I wait another month, I'll get another choice of templating languages ;)
Anonymous said…
These templating languages are highly code convenient --- which is nice. However, for separation between code and presentation (i.e., the holy grail) at the opposite end of the spectrum, you may want to look at StringTemplate:

http://www.stringtemplate.org/

which is available as PyStringTemplate 2.2 (as well as Java and C#). StringTemplate is very powerful and concise (in a functional programming style) yet avoids "leak"ing code into the presentation. Perfect for html.

FYI, the design of StringTemplate 3.0 is even more powerful and was driven by antlr 3.0 code generation (powerful templating) needs.

For example, StringTemplate has template inheritance (reuse of templates by inheritance) and ST 3.0 also has Template "regions" which were invented independently but match django's "blocks". I like to think of them as parameterized inheritance, where you can piecemeal substitute a particular sub-region/block with your custom sub-region/block while inheriting the rest of the template. The key is that you substitute a piece of an inherited template while reusing the template as a whole. Much more fine-grained than just template inheritance --- and therefore mighty useful for HTML header substitution, etc..

In any case, StringTemplate should be considered if looking for an industrial grade template engine where code and presentation separation is sought (or required).
jjinux said…
> The other bit worth mentioning is that Mako is 10-16x faster than Genshi and about 4-7x faster than Myghty/Django. If you need speed, this definitely matters.

Agreed

> While not everyone needs such speed, certain apps that are expected to have high loads and can't be cached definitely benefit from this.

Agreed

> I think its great that there's an excellent choice for XML-based templating (Genshi), and hope that Mako will be the cream of the crop for non-XML templating. There's certainly room for excellence in both categories,

Agreed
jjinux said…
> we know you prefer Genshi, but I know that you *love* those component-calls-with-content too :)

Hey, no fair hitting me at my weak spots ;)
jjinux said…
> so JJ, what is it about Genshi that you prefer over Mako?

1. I like the inverse inheritance thing via includes. Mako can do the same type of thing.

2. I like the XPath thing. This is perhaps the biggest selling point for me. I have to write the common look-and-feel for multiple apps. Using XPath to tweak any part of the look-and-feel for any given page is quite powerful.

3. I like the way Genshi is really smart about escaping HTML that I don't write myself. I'm tired of the XSS problem, and Genshi makes a lot of the problem go away.

4. I like the fact that Genshi has three syntaxes: something like Nevow, something like Cheetah, and something like Kid. I can have my cake, with the frosting, and eat it too :)
jjinux said…
> These templating languages are highly code convenient --- which is nice. However, for separation between code and presentation (i.e., the holy grail) at the opposite end of the spectrum, you may want to look at StringTemplate:

I think Genshi provides exactly the amount of separation that I feel is best. This is a matter of engineering taste.

Popular posts from this blog

Ubuntu 20.04 on a 2015 15" MacBook Pro

I decided to give Ubuntu 20.04 a try on my 2015 15" MacBook Pro. I didn't actually install it; I just live booted from a USB thumb drive which was enough to try out everything I wanted. In summary, it's not perfect, and issues with my camera would prevent me from switching, but given the right hardware, I think it's a really viable option. The first thing I wanted to try was what would happen if I plugged in a non-HiDPI screen given that my laptop has a HiDPI screen. Without sub-pixel scaling, whatever scale rate I picked for one screen would apply to the other. However, once I turned on sub-pixel scaling, I was able to pick different scale rates for the internal and external displays. That looked ok. I tried plugging in and unplugging multiple times, and it didn't crash. I doubt it'd work with my Thunderbolt display at work, but it worked fine for my HDMI displays at home. I even plugged it into my TV, and it stuck to the 100% scaling I picked for the othe

Drawing Sierpinski's Triangle in Minecraft Using Python

In his keynote at PyCon, Eben Upton, the Executive Director of the Rasberry Pi Foundation, mentioned that not only has Minecraft been ported to the Rasberry Pi, but you can even control it with Python . Since four of my kids are avid Minecraft fans, I figured this might be a good time to teach them to program using Python. So I started yesterday with the goal of programming something cool for Minecraft and then showing it off at the San Francisco Python Meetup in the evening. The first problem that I faced was that I didn't have a Rasberry Pi. You can't hack Minecraft by just installing the Minecraft client. Speaking of which, I didn't have the Minecraft client installed either ;) My kids always play it on their Nexus 7s. I found an open source Minecraft server called Bukkit that "provides the means to extend the popular Minecraft multiplayer server." Then I found a plugin called RaspberryJuice that implements a subset of the Minecraft Pi modding API for B

Creating Windows 10 Boot Media for a Lenovo Thinkpad T410 Using Only a Mac and a Linux Machine

TL;DR: Giovanni and I struggled trying to get Windows 10 installed on the Lenovo Thinkpad T410. We struggled a lot trying to create the installation media because we only had a Mac and a Linux machine to work with. Everytime we tried to boot the USB thumb drive, it just showed us a blinking cursor. At the end, we finally realized that Windows 10 wasn't supported on this laptop :-/ I've heard that it took Thomas Edison 100 tries to figure out the right material to use as a lightbulb filament. Well, I'm no Thomas Edison, but I thought it might be noteworthy to document our attempts at getting it to boot off a USB thumb drive: Download the ISO. Attempt 1: Use Etcher. Etcher says it doesn't work for Windows. Attempt 2: Use Boot Camp Assistant. It doesn't have that feature anymore. Attempt 3: Use Disk Utility on a Mac. Erase a USB thumb drive: Format: ExFAT Scheme: GUID Partition Map Mount the ISO. Copy everything from