【譯】Tempy-高性能面向對象的HTML模板庫

本文翻譯自

Fast Object-Oriented HTML templating With Python!

tempy是什麼?

沒有寫一個標籤就能創建HTML。tempy動態生成HTML,並且能用python或jQuery風格訪問。對DOM定位或操作可以使用python或jQuery風格操作

為什麼使用tempy?

HTML代碼中的使用Python語法,這樣的模板系統是不錯,但還不夠酷(你還得用某種方法編寫HTML)。Tempy就是為此而生的。

特性

沒不用解析、簡單的結構使得Tempy運行飛快。Tempy只是將HTML標籤加在您的數據旁,實際上HTML字元串只存在在渲染時。

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 @ 127.0.0.1:8888/tempy + 127.0.0.1:8888/j2 10 threads and 200 connections

用例

一、基本模板

from tempy.tags import Html, Head, Body, Meta, Link, Div, P, Annmy_text_list = [This is foo, This is Bar, Have you met my friend Baz?]nanother_list = [Lorem ipsum , dolor sit amet, , consectetur adipiscing elit]nn#生成標籤對象npage = Html()( # 在父標籤html內插入headn Head()( # 在父標籤head內插入meta和linkn Meta(charset=utf-8), n Link(href="my.css", typ="text/css", rel="stylesheet")n ),n body=Body()( # 給標籤名字和屬性,以便於DOM操作n Div(klass=linkBox)(n A(href=Foo.com)n ),n (P()(text) for text in my_text_list) # 標籤內插入可迭代對象 n )n)nnprint(page.render())n

運行結果

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

二、元素的創建和移除

通過實例標籤來創建DOM元素

page = Html()nn<html></html>n

調用函數來增加元素或內容

page(Head())n

運行

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

使用 jQuery風格操作DOM

body = Body()npage.append(body)n

運行

<html><head></head><body></body></html>n

div = Div().append_to(body)n

運行

<html><head></head><body><div></div></body></html>n

div.append(This is some content, Br(), And some Other)n

運行

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

同理,移除元素如下

head.remove()n

運行

<html><body><div></div></body></html>n

body.empty()n

運行

<html><body></body></html>n

page.pop()n

運行

<html></html>n

三、標籤屬性

定義標籤時或創建標籤後,對每個標籤添加屬性

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

運行

<div id="my_dom_id" class="someHtmlClass"></div>n

a = A(klass=someHtmlClass)(text of this link)na.attr(id=another_dom_id)na.attr({href: www.thisisalink.com})n

運行

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

也可使用jQuery風格編輯標籤屬性

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

運行

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

四、DOM定位

每個tempy標籤內容都是可迭代對象,性質就像python的列表

divs = [Div(id=div, klass=inner) for div in range(10)]nps = (P() for _ in range(10))ncontainer_div = Div()(divs)nnfor i, div in enumerate(container_div):n div.attr(id=divId+str(i))ncontainer_div[0].append(ps)ncontainer_div[0][4].attr(id=pId)n

運行

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

在容器中訪問元素,就像它們是屬性一樣。

container_div = Div()ncontainer_div(content_div=Div())ncontainer_div.content_div(Some content)n

運行

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

如果你覺得你會用jQuery風格:

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

歡迎關注公眾號:大鄧帶你玩Python

推薦閱讀:

Python愛好者必看11個常用站點
十分鐘入門pandas(中)【解讀pandas官方文檔】
Python網路爬蟲(二)- urllib爬蟲案例
python高級特性
Python面向對象編程(OOP)

TAG:Python | Python教程 | Flask |