用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")
  2. 用文件github

    from mako.template import Template
    
    
    mytemplate = Template(filename='/docs/mytmpl.txt', module_directory='/tmp/mako_modules')
    print mytemplate.render()
  3. 當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_responsejsp

用django-mako後

一個簡單的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
```

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]
    %>
相關文章
相關標籤/搜索