用mako增强django模板,用法像jsp

用mako增强django模板

django默认的模板功能还可以,但是不能直接用python的语法,mako解决了这个痛点,
使得django的模板变得像jsp一样,可以直接使用python的语法做一些事情。

mako
django-mako
demo

mako基本用法

mako的模板需要这样子搞

  1. 直接的类似python string format的样子

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

  2. 用文件

    from mako.template import Template

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

  3. 当template里面需要继承或者超找其他模板文件的时候,需要TemplateLookup

    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

用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
  • 表达式

    ${表达式}: ${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]

    %>

时间: 2024-08-29 14:51:27

用mako增强django模板,用法像jsp的相关文章

Django模板用法

django模板原理 # 创建template对象,由context对象传递template所需要的值, 有render方法进行模板的呈现 # 写模板,创建 Template 对象,创建 Context , 调用 render() 方法. # Python 字符串都有 upper() 和 isdigit() 方法,你在模板中调用 # 执行变量 {{ abc }} # 判断 {% if x > 0 %} {% else %} {% endif %} 例: {% if today_is_weeken

Django项目实践2 - Django模板(常用语法规则)

http://blog.csdn.net/pipisorry/article/details/45727309 模板中常用的语法规则 {最新版本的Django语法可能有改变,不支持的操作可能支持了.[HTML教程 - 基本元素/标签及属性]} Django 模板标签 if/else 标签 1. 基本语法格式如下: {% if condition %} ... display {% endif %} 或者: {% if condition1 %} ... display 1 {% elif con

Django模板系统学习整理

block extends include三者的差别跟用法 一.定义基础模板,在html内容中定义多个block块,block由子模板引用同名block块,来决定是否替换这些部分 {% block title %}一些内容,这里可不填{% endblock %} {% block content %}一些内容,这里可不填{% endblock %} {% block footer %}一些内容,这里可不填{% endblock %} 这里 title content footer 不是变量,名字

Django模板系统(非常详细)(后台数据如何展示在前台)

前面的章节我们看到如何在视图中返回HTML,但是HTML是硬编码在Python代码中的这会导致几个问题:1,显然,任何页面的改动会牵扯到Python代码的改动网站的设计改动会比Python代码改动更频繁,所以如果我们将两者分离开会更方便2,其次,写后台Python代码与设计HTML是不同的工作,更专业的Web开发应该将两者分开页面设计者和HTML/CSS程序员不应该编辑Python代码,他们应该与HTML打交道3,程序员写Python代码同时页面设计者写HTML模板会更高效,而不是一个人等待另一

Django模板系统详解

你可能已经注意到我们在例子视图中返回文本的方式有点特别.也就是说,HTML被硬性地直接写入 Python代码之中. 这种处理会导致一些问题: § 对页面设计的进行任何改变都必须对 Python代码进行相应的修改.站点设计的修改往往比底层Python代码的修改要频繁得多,因此如果可以在不进行 Python代码修改的情况下变更设计,那将会方便得多. § Python代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成.设计人员和 HTML

django模板页闪现信息

flask框架有个flash()函数,可以显示信息一会儿,再自动消失. django的模板html文件里要显示它,可以使用$.scojs_message( )函数,要引用sco.message.js文件,它是Bootstrap的增强组件. 使用过程中遇到一个问题,就是javascript中是否可以使用django的模板标签template tag. 对于媒体数据,需要指定mime类型. 我这里用到字符串,只需要直接使用 {{ }}花括号. 如代码: {% if err %} <script>$

Django项目实践2 - Django模板

http://blog.csdn.net/pipisorry/article/details/45061511 上篇:Django项目实践1 - 创建Django项目 Django模板 {视图和模板对逻辑和显示进行了分隔} 上面是使用 django.http.HttpResponse() 来输出"Hello World!".该方式将数据与视图混合在一起,不符合Django的MVC思想.或者HTML被直接硬编码在 Python 代码之中. html = "<html>

python django 模板

1 用两个大括号括起来的文字{{person_name}} 称为变量 2 被 大括号和面分号包围的文件({% if ordered_warranty %})是模板标签 3 过滤器是用管道符(|) 和Unix管道符一样 4 一旦你创建一个 Template 对象,你可以用 context 来传递数据给它. 一个context是一系列变量和它们值的集合.模板使用它来赋值模板变量标签和 执行块标签. 5 变量名必须由英文字符开始 (A-Z或a-z)并可以包含数字字符.下划线和小数点. (小数点在这里有

Django模板常用语法规则

Django 模板标签 if/else 标签 for 标签 ifequal/ifnotequal 标签 注释标签 过滤器 include 标签 URL标签 模板继承   if/else 标签1. 基本语法格式如下:{% if condition %} ... display{% endif %}或者: {% if condition1 %} ... display 1{% elif condiiton2 %} ... display 2{% else %} ... display 3{% end