一个直观、高性能的html呈现框架
htmldoom的Python项目详细描述
htmldoom
直观,高性能HTML渲染框架
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>><>>>>>>>>>>>>>>>>>
><>
>
>>
>>
>
>>
>>>>
p>
>>> from htmldoom import render, composite_tag >>> >>> clipboard_copy = composite_tag("clipboard-copy") >>> print(render(clipboard_copy(value="foo")("Copy Me"))) <clipboard-copy value="foo">Copy Me</clipboard-copy>
一种快速的动态元素呈现机制
选择适合您的语法:
语法1
>>> from htmldoom import renders, elements as e >>> >>> @renders( ... e.p()("{x}"), ... e.p()("another {x}"), ... ) ... def render_paras(data: dict) -> dict: ... return {"x": data["x"]} >>> >>> render_paras({"x": "awesome paragraph"}) <p>awesome paragraph</p><p>another awesome paragraph</p>
语法2
>>> from htmldoom import renders, elements as e >>> >>> render_paras = renders( ... e.p()("{x}"), ... e.p()("another {x}"), ... )(lambda data: {"x": data["x"]}) >>> >>> render_paras({"x": "awesome paragraph"}) <p>awesome paragraph</p><p>another awesome paragraph</p>
注意:此机制在文件加载和重用时编译模板。
renders( ...compile-time code... )( ...runtime code... )
从运行时移到编译时的执行次数越多,执行速度越快。
如果正确使用此机制并将动态页折射到更小的组件中,它的性能可能超过传统的模板渲染引擎。所以编译时代码中的每个{`或}都需要用{{或}转义。
带有开关盒(可能无用)的函数式foreach循环
>>> from htmldoom import elements as e >>> from htmldoom import functions as fn >>> >>> tuple(fn.foreach(["good", "bad", "evil"])( ... lambda x: fn.switch({ ... x == "good": lambda: e.span(style="color: green")(f"this is {x}"), ... x == "bad": lambda: e.span(style="color: yellow")(f"this is {x}"), ... x == "evil": lambda: e.span(style="color: red")(f"this is {x}"), ... fn.Case.DEFAULT: lambda: fn.Error.throw(ValueError(x)), ... }) ... )) (b'<span style="color: green">this is good</span>', b'<span style="color: yellow">this is bad</span>', b'<span style="color: red">this is evil</span>')
q/a
这里的目标是什么?
主要目标是使用python编写动态html页面更干净、更简单、更安全和直观。
性能如何?
尽管性能不是这里的主要目标,但它不应该成为障碍。htmldoom使用纯函数和可散列的输入参数作为元素。因此,它可以在内部有效地使用缓存。它还提供了一种友好的机制,可以在编译为字节码时使用@renders
装饰器预先呈现页面的静态部分。
此外,由于它可以帮助您(可能会迫使您)将网页重构为多个呈现函数,因此您可以自由使用任何您喜欢的优化。尝试在呈现函数中放入@lru_cache
?
是否有基准?
>
>
>
>
插件和生态系统的插件和生态系统的插件和生态系统
>
>
>
>
>
>
>