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 相关文章推荐
Golang二维切片初始化的实现
Apr 08 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
golang elasticsearch Client的使用详解
May 05 Golang
goland 设置project gopath的操作
May 06 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang入门之计时器
May 04 Golang
基于Python实现西西成语接龙小助手
Aug 05 Golang
Go gorilla/sessions库安装使用
Aug 14 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
用PHP实现多级树型菜单
2006/10/09 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
激活 ActiveX 控件
2006/10/09 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
JS动态生成年份和月份实例代码
2017/02/04 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
vue 中自定义指令改变data中的值
2017/06/02 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
Python中多线程的创建及基本调用方法
2016/07/08 Python
浅谈python对象数据的读写权限
2016/09/12 Python
详解如何利用Cython为Python代码加速
2018/01/27 Python
Python打印输出数组中全部元素
2018/03/13 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
python使用Turtle库绘制动态钟表
2018/11/19 Python
python打开文件的方式有哪些
2020/06/29 Python
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
xxx同志考察材料
2014/02/07 职场文书
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
高中生家长寄语大全
2014/04/03 职场文书
安全保证书范文
2014/04/29 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
导游词之贵州织金洞
2019/10/12 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
Python实现抖音热搜定时爬取功能
2022/03/16 Python
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android