`
zuroc
  • 浏览: 1309799 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

pylons mako 摘录笔记

阅读更多
pylons mako笔记

1.

在pylons中设置为utf-8编码

在pylons工程config/environment.py文件最后,添加

tmpl_options['mako.default_filters'] = ['decode.utf8']

2.

${}中间直接是python代码,显示其返回值

this is x: ${x}

pythagorean theorem:  ${pow(x,2) + pow(y,2)}

3.

${"this is some text" | u}

u : url编码this+is+some+text
h : html编码
x : xml编码
trim : whitespace trimming, provided by string.strip()
n : disable all default filtering; only filters specified in the local expression tag will be applied.

自定义filter
<%!
    def myescape(text):
        return "<TAG>" + text + "</TAG>"
%>


Heres some tagged text: ${"text" | myescape}

Or from any Python module:

<%!
    import myfilters
%>

Heres some tagged text: ${"text" | myfilters.tagfilter}

默认过滤器

<%page expression_filter="h"/>

Escaped text:  ${"<html>some html</html>"}

可以在配置中定义默认的filter
t = TemplateLookup(directories=['/tmp'],
    default_filters=['unicode', 'myfilter'],
    imports=['from mypackage import myfilter']

禁用其他,只用trim
${'myexpression' | n, trim}

函数也可以用

<%def name="foo()" filter="h, trim">
    <b>this is bold</b>
</%def>


4.

控制语句

% 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


直接编写python代码
<%
    x = db.get_resource('foo')
    y = [z.element for z in x if x.frobnizzle==5]
%>


模块级别的代码
<%!
    import mylib
    import re

    def filter(text):
        return re.sub(r'^@', '', text)
%>


5.

单行注释
## this is a comment.

多行注释
<%doc>
    these are comments
    more comments
</%doc>


6.
标签

包含,可以有变量
<%include file="foo.txt"/>
<%include file="/foo/bar/${myfile}.txt"/>

定义类似函数html文本段
${account()}

<%def name="account()">
    Account for ${username}:<br/>

    % for row in accountdata:
        Value: ${row}<br/>
    % endfor
</%def>

定义该页模板的参数
<%page cached="True" cache_type="memory"/>

名字空间
<%namespace file="functions.html" import="*"/>

<%namespace name="mystuff" file="mystuff.html"/>

${mystuff.somedef(x=5,y=7)}

The <%namespace> tag also supports some of the other semantics of Python's import statement, including pulling names into the local variable space, or using * to represent all names, using the import attribute:

<%namespace file="mystuff.html" import="foo, bar"/>


继承
## base.html
<html>
    <body>
        <div class="header">
            ${self.header()}
        </div>

        ${self.body()}

        <div class="footer">
            ${self.footer()}
        </div>
    </body>
</html>

<%def name="footer()">
    this is the footer
</%def>

this is the body content.

也可以用
    ${next.body()}
表示下一级继承页面

    ${parent.toolbar()}
访问上一层
----------------------------------

## index.html
<%inherit file="base.html"/>

<%def name="header()">
    this is some header content
</%def>





纯文本
<%text filter="h">
    heres some fake mako ${syntax}
    <%def name="x()">${x}</%def>
</%text>


8.
函数更多用法演示:

缓存
<%def name="somedef()" buffered="true">
    somedef's results
</%def>
----------------------------------
${account(accountname='john')}

<%def name="account(accountname, type='regular')">
    account name: ${accountname}, type ${type}
</%def>
----------------------------------
嵌套函数
<%def name="mydef()">
    <%def name="subdef()">
        a sub def
    </%def>

    im the def, and the subcomopnent is ${subdef()}
</%def>
----------------------------------
调用者
<%def name="buildtable()">
    <table>
        <tr><td>
            ${caller.body()}
        </td></tr>
    </table>
</%def>

<%call expr="buildtable">
    I am the table body.
</%call>

输出
<table>
    <tr><td>
        I am the table body.
    </td></tr>
</table>

----------------------------------

<%def name="lister(count)">
    % for x in range(1,count):
        ${caller.body()}
    % endfor
</%def>

<%call expr="lister(3)">
    hi
</%call>

输出
hi
hi
hi

----------------------------------

<%def name="conditional(expr)">
    % if expr:
        ${caller.body()}
    % endif
</%def>

<%call expr="conditional(4==4)">
    im the result
</%call>

----------------------------------


<%def name="layoutdata(somedata)">
    <table>
    % for item in somedata:
        <tr>
        % for col in item:
            <td>${caller.body(col=col)}</td>\
        % endfor
        </tr>
    % endfor
    </table>
</%def>

<%call expr="layoutdata([[1,2,3],[4,5,6],[7,8,9]])" args="col">
    Body data: ${col}
</%call>
输出:

<table>
    <tr>
        <td>Body data: 1</td><td>Body data: 2</td><td>Body data: 3</td>
        <td>Body data: 4</td><td>Body data: 5</td><td>Body data: 6</td>
        <td>Body data: 7</td><td>Body data: 8</td><td>Body data: 9</td>
    </tr>
</table>

----------------------------------

<%def name="layout()">
    ## a layout def
    <div class="mainlayout">
        <div class="header">
            ${caller.header()}
        </div>
        <div class="sidebar">
            ${caller.sidebar()}
        </div>
        <div class="content">
            ${caller.body()}
        </div>
    </div>
</%def>

## calls the layout def
<%call expr="layout">
    <%def name="header()">
        I am the header
    </%def>
    <%def name="sidebar()">
        <ul>
            <li>sidebar 1</li>
            <li>sidebar 2</li>
        </ul>
    </%def>

        this is the body
</%call>

输出


<div class="mainlayout">
    <div class="header">
        I am the header
    </div>
    <div class="sidebar">
        <ul>
            <li>sidebar 1</li>
            <li>sidebar 2</li>
        </ul>
    </div>
    <div class="content">
        this is the body
    </div>
</div>
分享到:
评论
8 楼 zuroc 2008-12-25  
生成的代码有问题 ,生成的代码应该类似
        for k,v in unreview.items():
            # SOURCE LINE 28
            write('<h2>')
            write(filters.html_escape(str(k)))
       

我看你生成的代码(u'\r%f
都有个"\r"做为开头
我怀疑是换行的问题,
保存为linux的换行看看
7 楼 frankli 2008-12-25  
${newinfo}
newinfo输出是(('6a526661d18a11dd898b0017317ff943', 'clsid1'), ('6a526662d18a11ddb8af0017317ff943', 'clsid2'))

%for x in newinfo:
%if x != "":
<b>${x[0]}</b><br>
%else:
<b>nothing</b>
%endif
%endfor

这个里面的newinfo是tuple的,我输出的时候他提示类型(我故意写错他会提示转型错误,所以我确认是tuple的);
6 楼 frankli 2008-12-25  
我输入查看提示是tuple,我用LIST转后还是提示是这个错误,

        __M_writer(escape(newinfo))
        __M_writer(u'\r%for i in range(1,10):\r  ')
        __M_writer(escape(i))
        __M_writer(u'\r%endfor \r\r\r<br>\r<br>\r<

这个是生成的模模版代码;提示本行的i没有定义.
5 楼 zuroc 2008-12-24  
估计里面有个东西既不是空字符串,也不是tuple
4 楼 zuroc 2008-12-24  
1.开启缓存
2.看生成的代码
3 楼 frankli 2008-12-24  
${newinfo}
newinfo输出是(('6a526661d18a11dd898b0017317ff943', 'clsid1'), ('6a526662d18a11ddb8af0017317ff943', 'clsid2'))

%for x in newinfo:
%if x != "":
<b>${x[0]}</b><br>
%else:
<b>nothing</b>
%endif
%endfor

报错:TypeError: 'Undefined' object is unindexable
这是以前的代码,有结束符的,我测试${x}就输出全是字会串,如果${x[0]}就是上面的报错;
我找了两天了还没有找到问题。麻烦您给指点一下。谢谢。
2 楼 zuroc 2008-12-24  
for ... :
1 楼 frankli 2008-12-24  
您好,我安装了Mako-0.2.3+pylons-dev-15206414f9ff,但是在MAKO模版文件里控制语句
%for i in range(1,10)
  ${i}
%endfor

这个一直是输出是字符串,找了好久也没有解决这个问题.不知道能否抽时间交流一下.谢谢.

QQ52522835/frankli.sh@gmail.com

相关推荐

    mako 0.5.0 Python Mako Template模板

    Mako模板通常被用于Web开发框架,如Pylons、Pyramid和Gunicorn等,用于生成动态网页内容。同时,由于其强大的文本处理能力,Mako也被用于生成各种类型的文档,如报告、邮件、配置文件等。 **安装与集成** 对于这个...

    Mako-0.2.5.tar.gz

    Mako 可以很好地与其他 Python Web 框架集成,如 Flask、 Pyramid 和 Pylons 等。例如,在 Flask 中,你可以这样配置 Mako: ```python from flask import Flask from flask_mako import MakoTemplates app = ...

    Mako-0.4.1.tar.gz

    pylons默认的模板就是用的它;相比而言,Django 内建的模板引擎,为了维持所谓模板语法的纯粹性和简单性,更纯粹的满足 MVC 模式的规定,牺牲了很多灵活性,一些高级的功能不得不利用 tag 和 filter 来实现,其写法...

    Python库 | Pylons-0.8.2-py2.3.egg

    6. **模板引擎支持**:Pylons支持多种模板引擎,如Mako、Genshi和Jinja2,使开发者可以根据需求选择合适的模板语言来渲染视图。 7. **强大的社区支持**:Pylons拥有活跃的社区,提供丰富的文档、教程和第三方插件,...

    Mako-0.7.0.tar.gz

    9. **与Web框架的集成(Integration with Web Frameworks)**:Mako与其他Python Web框架如Pylons、Pyramid、Flask和Django等有很好的集成,可以直接在这些框架中使用Mako模板。 在解压Mako-0.7.0.tar.gz后,你会...

    Apress.the.Definitive.Guide.to.Pylons.Dec.2008

    5. **模板系统**:介绍了Pylons支持的几种模板引擎,如Mako、Genshi等,并展示了如何使用它们构建动态网页。 6. **数据库集成**:讨论了Pylons与SQLAlchemy等ORM工具的集成方法,以及如何利用这些工具进行高效的...

    借着今天的大好日子,挖一个Pylons教程的坑

    6. **模板引擎**:介绍Pylons常用的模板语言,如Mako或Jinja2,以及如何在视图中使用它们。 7. **模型与数据库**:探讨ORM(对象关系映射)工具,如SQLAlchemy,以及如何设计和操作数据库模型。 8. **错误处理与...

    Gardner -- The Definitive Guide to Pylons -- 2008.pdf

    根据提供的文件信息,我们可以推断出这是一本关于Pylons框架的技术书籍,作者是James Gardner,出版于2008年。以下是对该书的关键知识点进行的详细解读。 ### 关键知识点概述 #### 1. **Pylons 框架简介** - **...

    [James_Gardner]_The_Definitive_Guide_to_Pylons(z-lib.org).rar

    In this book, cofounder and lead developer James Gardner brings you a comprehensive introduction to Pylons, the web framework that uses the best of Ruby, Python, and Perl and the emerging WSGI ...

    Python Web框架Pylons中使用MongoDB的例子

    在Python Web开发中,Pylons是一个轻量级、高性能的框架,它以其高度可定制性而受到开发者喜爱。Pylons采用MVC(Model-View-Controller)设计模式,允许开发者灵活选择不同的库来实现各个层的功能。在本例子中,我们...

    PyPI 官网下载 | Pylons-0.8.2-py2.3.egg

    资源来自pypi官网。 资源全名:Pylons-0.8.2-py2.3.egg

    pylons:Pylons框架,社区在Pylons项目的指导下得到了维护。 与repoze.bfg合并用于金字塔框架

    笔记定向塔已与repoze.bfg合并,并且现在处于仅维护模式。 强烈建议新项目从新的合并的Web框架。安装。 如果要从源代码安装,可以运行以下命令: $ python setup.py install 如果尚未安装该模块,它将显示一条消息...

    Gardner -- The Definitive Guide to Pylons -- 2008 -- code.7z

    Gardner -- The Definitive Guide to Pylons -- 2008 -- code.7z

    Pyramid英文文档.pdf

    Pyramid 是一款现代 Python Web 开发框架,作为 Pylons 框架的升级版本,它不仅继承了原有框架的优点,还进行了诸多改进与增强。根据提供的文件描述,我们可以提炼出以下几个关键知识点: 1. **Pyramid 的独特之处*...

    塔架pylons_VR游戏开发_天空盒子_Skybox_高清_16K_EXR

    可用于UnityVR开发,3D游戏开发,高清天空盒子Skybox素材,游戏环境背景素材,无水印。 让你身临其境的天空盒子,各类题材丰富,都是辛苦搜罗所得的高清exr格式,可以直接用于Unity开发,特别是VR游戏的开发。...

    pyramid-1.2.tar.gz

    它是Pylons框架的进化版,旨在提供更加轻量级、模块化且易于扩展的解决方案,以满足现代Web应用的需求。在本文中,我们将深入探讨Pyramid 1.2的源码,理解其核心概念,并探索如何构建基于Pyramid的应用。 **一、...

Global site tag (gtag.js) - Google Analytics