django默認的模板功能還能夠,可是不能直接用python的語法,mako解決了這個痛點,
使得django的模板變得像jsp同樣,能夠直接使用python的語法作一些事情。html
mako
django-mako
demopython
直接的相似python string format的樣子git
from mako.template import Template mytemplate = Template("hello, ${name}!") print mytemplate.render(name="jack")
用文件github
from mako.template import Template mytemplate = Template(filename='/docs/mytmpl.txt', module_directory='/tmp/mako_modules') print mytemplate.render()
當template裏面須要繼承或者超找其餘模板文件的時候,須要TemplateLookupdjango
from mako.template import Template from mako.lookup import TemplateLookup mylookup = TemplateLookup(directories=['/docs']) mytemplate = Template("""<%include file="header.txt"/> hello world!""", lookup=mylookup)
感受很複雜的樣子,django-mako
的出現將這些繁瑣的東西降至0,使django依然能夠使用 render_to_response
jsp
一個簡單的viewcode
``` from djangomako.shortcuts import render_to_response def index(request): return render_to_response('index.html', {}) ```
index.htmlorm
``` <%! import os %> <% rows = [[v for v in range(0,10)] for row in range(0,10)] %> <%def name="makerow(row)"> <tr> % for name in row: <td>${name}</td>\ % endfor </tr> </%def> <html> <body> ${os.path.sep} <table> % for row in rows: ${makerow(row)} % endfor </table> </body> </html> ```
之因此能這樣調用都是由於django-mako有這麼一箇中間件,在settings.py中加入這個中間件就能夠輕鬆的使用mako的語法了htm
``` from mako.lookup import TemplateLookup import tempfile class MakoMiddleware(object): def __init__(self): """Setup mako variables and lookup object""" from django.conf import settings # Set all mako variables based on django settings global template_dirs, output_encoding, module_directory, encoding_errors directories = getattr(settings, 'MAKO_TEMPLATE_DIRS', settings.TEMPLATE_DIRS) module_directory = getattr(settings, 'MAKO_MODULE_DIR', tempfile.mkdtemp()) output_encoding = getattr(settings, 'MAKO_OUTPUT_ENCODING', 'utf-8') encoding_errors = getattr(settings, 'MAKO_ENCODING_ERRORS', 'replace') global lookup lookup = TemplateLookup(directories=directories,. module_directory=module_directory, output_encoding=output_encoding,. encoding_errors=encoding_errors, ) import djangomako djangomako.lookup = lookup ```
文檔中間件
註釋
<%doc> these are comments more comments </%doc>
表達式
${表達式}: ${2*3} --> 6 ${pow(x,2) + pow(y,2)}
控制
% for a in ['one', 'two', 'three', 'four', 'five']: % if a[0] == 't': its two or three % elif a[0] == 'f': four/five % else: one % endif % endfor
代碼塊
與是不同的,只會載入一次,所以像定義方法,import東西的時候寫在這裏面
<%! import mylib import re def filter(text): return re.sub(r'^@', '', text) %> <% x = db.get_resource('foo') y = [z.element for z in x if x.frobnizzle==5] %>