用mako加強django模板,用法像jsp

用mako加強django模板

django默認的模板功能還能夠,可是不能直接用python的語法,mako解決了這個痛點, 使得django的模板變得像jsp同樣,能夠直接使用python的語法作一些事情。html

mako django-mako demopython

mako基本用法

mako的模板須要這樣子搞

  1. 直接的相似python string format的樣子git

    from mako.template import Template mytemplate = Template("hello, ${name}!") print mytemplate.render(name="jack")github

  2. 用文件django

    from mako.template import Templatejsp

    mytemplate = Template(filename='/docs/mytmpl.txt', module_directory='/tmp/mako_modules') print mytemplate.render()code

  3. 當template裏面須要繼承或者超找其餘模板文件的時候,須要TemplateLookuporm

    from mako.template import Template from mako.lookup import TemplateLookuphtm

    mylookup = TemplateLookup(directories=['/docs']) mytemplate = Template("""<%include file="header.txt"/> hello world!""", lookup=mylookup)中間件

感受很複雜的樣子,django-mako的出現將這些繁瑣的東西降至0,使django依然能夠使用render_to_response

用django-mako後

一個簡單的view

from djangomako.shortcuts import render_to_response

def index(request):
    return render_to_response('index.html', {})

index.html

<%! 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的語法了

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

mako的語法

文檔

  • 註釋

    <%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] %>

相關文章
相關標籤/搜索