Go web入门Go pongo2模板引擎


Posted in Golang onMay 20, 2022

Go pongo2 教程展示了如何使用 pongo2 模板引擎在 Golang 中使用模板。

模板引擎是一个库,旨在将模板与数据结合起来以生成文档。模板引擎用于生成大量电子邮件、源代码预处理或生成动态 HTML 页面。

模板由静态数据和动态区域组成。动态区域稍后被数据替换。渲染函数稍后将模板与数据结合起来。模板引擎用于将模板与数据模型相结合以生成文档。

pongo2 库是一个受 Django 模板引擎启发的 Go 模板引擎。

下载 pongo2 函数库

使用如下命令:

go get -u github.com/flosch/pongo2/v4

安装成功后可以看到如下输出:

go: downloading github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3
go: downloading github.com/flosch/pongo2/v4 v4.0.2
go: downloading gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b
go: downloading github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e
go: downloading github.com/kr/text v0.1.0
go: added github.com/flosch/pongo2/v4 v4.0.2

pongo2 在模板字符串中使用了各种分隔符:

{% %} - statements

{{ }} - expressions to print to the template output

{# #} - comments which are not included in the template output

# ## - line statements

模板可以从带有 pongo2.FromString 的字符串、带有 pongo2.FromFile 的文件或带有pongo2.FromBytes 的字节中读取。

文档使用 Execute、ExecuteWriter 或 ExecuteBytes 函数呈现。这些函数接受一个上下文,它为模板提供常量、变量、实例或函数。

从字符串中读取模板

pongo2.FromString 函数从字符串中读取模板。如下代码将生成一条简单的文本消息:

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromString("Hello {{ name }}~")
    if err != nil {
        log.Fatal(err)
    }
    res, err := tpl.Execute(pongo2.Context{"name": "宇宙之一粟"})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

要打印的变量放在 {{ }} 括号内。

tpl, err := pongo2.FromString("Hello {{ name }}!")

接着,我们使用 Execute 渲染最终的字符串。在上下文中,我们为 name 变量传递一个值 “宇宙之一粟”:

res, err := tpl.Execute(pongo2.Context{"name": "宇宙之一粟"})

最后,运行该代码:

$ go run main.go         
Hello 宇宙之一粟~

如下图:

Go web入门Go pongo2模板引擎

再来看一个例子,我们可以传递两个文本:

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromString("{{ name }}是{{ occupation }}")
    if err != nil {
        log.Fatal(err)
    }
    name, occupation := "宇宙之一粟", "程序猿?‍?‍"
    ctx := pongo2.Context{"name": name, "occupation": occupation}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

运行该代码:

$ go run main.go
宇宙之一粟是程序猿?‍?‍

从文件中读取文本

使用 ​​pongo2.FromFile​​ 函数,我们从文件中读取模板。

新建一个 test.tpl 模板文件:

{{ name }}是{{ occupation }}

该示例生成一条简单的消息,同时从文件中读取模板。写好 main.go 文件:

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromFile("test.tpl")
    if err != nil {
        log.Fatal(err)
    }
    name, occupation := "宇宙之一粟", "不掉发的程序猿"
    ctx := pongo2.Context{"name": name, "occupation": occupation}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

运行该程序:

$ go run main.go
宇宙之一粟是不掉发的程序猿

Go pongo2 迭代

for 语句用于迭代模板中的数据集合。

新建一个 words.tpl 文件:

{% for word in words -%}
    {{ word }}
{% endfor %}

在模板中,我们使用 for 指令来遍历 words 数据结构的元素。可以用 - 字符去除空白字符。

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromFile("words.tpl")
    if err != nil {
        log.Fatal(err)
    }
    words := []string{"只要", "对", "编码", "保持", "热爱", "!"}
    ctx := pongo2.Context{"words": words}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

在程序中,我们将一段单词传递给 tempate 引擎。我们得到一个单词列表作为输出。

$ go run main.go
只要
对
编码
保持
热爱
!

Go pongo2 过滤

可以将过滤器应用于数据以修改它们。在 | 之后应用过滤器特点。

更改 words.tpl 文件

{% for word in words -%}
    {{ word }} has {{ word | length }} characters
{% endfor %}

main 文件:

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromFile("words.tpl")
    if err != nil {
        log.Fatal(err)
    }
    words := []string{"只要", "对", "编码", "保持", "热爱", "!"}
    ctx := pongo2.Context{"words": words}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

在程序中,我们将一段单词传递给模板。我们打印每个单词及其大小。运行该程序:

只要 has 2 characters
对 has 1 characters
编码 has 2 characters
保持 has 2 characters
热爱 has 2 characters
! has 1 characters

Go pongo2 条件

可以使用 if/endif 指令创建条件。

新建一个 todo.tpl 文件:

{% for todo in todos -%}
    {% if todo.Done %}
        {{- todo.Title -}}
    {% endif %}
{% endfor %}

在模板文件中,我们使用 if 指令仅输出已完成的任务。

我们从一片待办事项中生成输出。在输出中,我们仅包含已完成的任务。

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
type Todo struct {
    Title string
    Done  bool
}
type Data struct {
    Todos []Todo
}
func main() {
    tpl, err := pongo2.FromFile("todo.tpl")
    if err != nil {
        log.Fatal(err)
    }
    todos := []Todo{
        {Title: "看书一小时", Done: false},
        {Title: "写代码五小时", Done: true},
        {Title: "吃饭三餐", Done: true},
        {Title: "不加班", Done: false},
        {Title: "日更写文章", Done: true},
    }
    ctx := pongo2.Context{"todos": todos}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

运行代码:

$ go run main.go
写代码五小时
吃饭三餐
日更写文章

总结

这篇文章介绍了第三方模板库 pongo2,pongo2 是一种类似于 Django 语法的 Go 的模板语言。并介绍了从字符串和文件中两种方式获取文本,并介绍了 pongo2 的迭代、过滤和 if 条件的使用,并给出了每个代码案例,希望能对你有帮助。关于 pongo2 的更多用法请参考官方链接,还有更多基于 pongo2 的第三方扩展库,都值得一看,哪个方便用哪个。

Go web入门Go pongo2模板引擎

参考链接:

https://zetcode.com/golang/pongo2/

https://github.com/flosch/pongo2

以上就是Go语言编程入门Go pongo2模板引擎的详细内容!


Tags in this post...

Golang 相关文章推荐
解决go在函数退出后子协程的退出问题
Apr 30 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
Go timer如何调度
Jun 09 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
golang内置函数len的小技巧
Jul 25 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Golang 结构体数据集合
Apr 22 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
Go语言入门exec的基本使用
May 20 #Golang
Golang并发工具Singleflight
May 06 #Golang
深入理解 Golang 的字符串
May 04 #Golang
Golang入门之计时器
May 04 #Golang
Golang 入门 之url 包
May 04 #Golang
Golang解析JSON对象
Apr 30 #Golang
Golang 并发编程 SingleFlight模式
You might like
我的论坛源代码(一)
2006/10/09 PHP
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
jQuery+php简单实现全选删除的方法
2016/11/28 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
document.write的几点使用心得
2014/05/14 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
班级聚会策划书
2014/01/16 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
《鸟的天堂》教学反思
2014/02/27 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
python实现简单倒计时功能
2021/04/21 Python