美文网首页Python语言与信息数据获取和机器学习
【译】Tempy-高性能面向对象的HTML模板库

【译】Tempy-高性能面向对象的HTML模板库

作者: 大邓和他的python | 来源:发表于2017-08-18 14:33 被阅读44次

高效的面向对象HTML模板(纯python)

tempy是什么?

没有写一个标签就能创建HTML。tempy动态生成HTML,并且能用python或jQuery风格访问。对DOM定位或操作可以使用python或jQuery风格操作

为什么使用tempy?

HTML代码中的使用Python语法,这样的模板系统是不错,但还不够酷(你还得用某种方法编写HTML)。Tempy就是为此而生的。

特性

没不用解析、简单的结构使得Tempy运行飞快。Tempy只是将HTML标签加在您的数据旁,实际上HTML字符串只存在在渲染时。

公众号:大邓带你玩python

用例

基本模板

from tempy.tags import Html, Head, Body, Meta, Link, Div, P, A


my_text_list = ['This is foo', 'This is Bar', 'Have you met my friend Baz?']
another_list = ['Lorem ipsum ', 'dolor sit amet, ', 'consectetur adipiscing elit']

#生成标签对象
page = Html()(  # 在父标签html内插入head
    Head()(  # 在父标签head内插入meta和link
        Meta(charset='utf-8'),  # add tag attributes using kwargs in tag initialization
        Link(href="my.css", typ="text/css", rel="stylesheet")
    ),
    body=Body()(  # 给标签名字和属性,以便于DOM操作
        Div(klass='linkBox')(
            A(href='www.foo.com')
        ),
        (P()(text) for text in my_text_list)  # 标签内插入可迭代对象    
        )
)

print(page.render())

运行

<html>
    <head>
        <meta charset="utf-8"></meta>
        <link href="my.css" type="text/css" rel="stylesheet"/>
    </head>
    <body>
        <div class="linkBox">
            <a href="www.foo.com"></a>
        </div>
        <p>This is foo</p>
        <p>This is Bar</p>
        <p>Have you met my friend Baz?</p>
    </body>
</html>

元素的创建和移除

通过实例标签来创建DOM元素

page = Html()

run

<html></html>

调用函数来增加元素或内容

page(Head())

run

<html><head></head></html>

使用 jQuery风格操作DOM

body = Body()
page.append(body)

run

<html><head></head><body></body></html>
div = Div().append_to(body)

run

<html><head></head><body><div></div></body></html>
div.append('This is some content', Br(), 'And some Other')

run

<html><head></head><body><div>This is some content<br>And some Other</div></body></html>

同理,移除元素如下

head.remove()

run

<html><body><div></div></body></html>
body.empty()

run

<html><body></body></html>
page.pop()

run

<html></html>

标签属性

定义标签时或创建标签后,对每个标签添加属性

div = Div(id='my_html_id', klass='someHtmlClass') 

run

<div id="my_dom_id" class="someHtmlClass"></div>
a = A(klass='someHtmlClass')('text of this link')
a.attr(id='another_dom_id')
a.attr({'href': 'www.thisisalink.com'})

run

<a id="another_dom_id" class="someHtmlClass" href="www.thisisalink.com">text of this link</a>

也可使用jQuery风格编辑标签属性

div2.css(width='100px', float='left')
div2.css({'height': '100em'})
div2.css('background-color', 'blue')

run

<div id="another_dom_id" class="someHtmlClass comeOtherClass" style="width: 100px; float: left; height: 100em; background-color: blue"></div>

DOM定位

每个tempy标签内容都是可迭代对象,性质就像python的列表

divs = [Div(id=div, klass='inner') for div in range(10)]
ps = (P() for _ in range(10))
container_div = Div()(divs)

for i, div in enumerate(container_div):
    div.attr(id='divId'+str(i))
container_div[0].append(ps)
container_div[0][4].attr(id='pId')

run

<div>
     <div id="divId0">
         <p></p>
         <p></p>
         <p></p>
         <p></p>
         <p id="pId"></p>
         <p></p>
         <p></p>
         <p></p>
         <p></p>
         <p></p>
     </div>
     <div id="divId1"></div>
     <div id="divId2"></div>
     <div id="divId3"></div>
     <div id="divId4"></div>
     <div id="divId5"></div>
     <div id="divId6"></div>
     <div id="divId7"></div>
     <div id="divId8"></div>
     <div id="divId9"></div>
 </div>

在容器中访问元素,就像它们是属性一样。

container_div = Div()
container_div(content_div=Div())

container_div.content_div('Some content')

run

<div><div>Some content</div></div>

如果你觉得你会用jQuery风格:

container_div.children()
container_div.first()
container_div.last()
container_div.next()
container_div.prev()
container_div.prev_all()
container_div.parent()
container_div.slice()

Tempy的性能

根据呈现内容的复杂性、页面上动态内容的数量、生成的输出的大小以及许多其他因素,性能有很大的不同。

Tempy没有解析字符串,不使用正则表达式和不加载html文件,相比传统的如jinja2和Mako框架,运行速度更快。

Used HW: 2010 IMac, CPU:2,8 GHz Intel Core i7 RAM:16 GB 1067 MHz DDR3 Osx: 10.12.6. Benchmark made using WRK

Running 20s test @ http://127.0.0.1:8888/tempy + http://127.0.0.1:8888/j2 10 threads and 200 connections

Tempy Avg Stdev Max +/- Stdev
Latency 109.55ms 52.04ms 515.33ms 93.09%
Req/Sec 118.27 37.36 240.00 73.77%
Jinja2 Avg Stdev Max +/- Stdev
Latency 216.04ms 16.05ms 267.06ms 91.16%
Req/Sec 59.29 20.53 151.00 71.23%

公众号:大邓带你玩python

相关文章

  • 【译】Tempy-高性能面向对象的HTML模板库

    高效的面向对象HTML模板(纯python) tempy是什么? 没有写一个标签就能创建HTML。tempy动态生...

  • iOS 数据库-WCDB

    WCDB —— 高性能易用的 SQLite 面向对象组件 WCDB 是基于 SQLite 的数据库封装,他简单易用...

  • Boolan - C++学习笔记 二 - 第一周

    C++程序设计(2) 第一周笔记 目录 泛型编程 面向对象 面向对象继承的内存模型 标准库:更多地使用模板编程,较...

  • JavaScript之面向对象编程

    五、面向对象编程 目录:面向对象原型继承、面向对象class继承(ES6引入的) 1.面向对象原型继承 类:模板 ...

  • 3基础知识

    3基础知识 Java是一个完整的平台,拥有庞大的库。简单、面向对象、网络技能、健壮、安全、可移植、易解释、高性能、...

  • 面向对象

    面向对象和面向过程的对比: 面向过程:库,全局变量,局部变量,功能,主入口 面向对象:库,全局变量,类(属性,操作...

  • Python模板库Mako的用法,你知道吗?

    前言 Mako是一个高性能的Python模板库,它的语法和API借鉴了很多其他的模板库,如Django、Jinja...

  • php面试常问的题目2

    PHP专业面试题汇总一、PHP基础:二、数据库部分三、面向对象部分四、ThinkPHP部分五、smarty模板引擎...

  • 使用Nunjucks

    Nunjucks模板引擎的使用涉及三个对象: 实例化Enviroment对象,即创建env对象 模板(html文件...

  • Jade - Java 面向对象1

    面向对象关键 面向对象 相对于 面向过程(一步一步) 类: 类是对象的模板 对象: 对象是类的一个实例 类: 一组...

网友评论

    本文标题:【译】Tempy-高性能面向对象的HTML模板库

    本文链接:https://www.haomeiwen.com/subject/wxrarxtx.html