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 27 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
Golang的继承模拟实例
Jun 30 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 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随机生成信用卡卡号的方法
2015/03/23 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
学习python处理python编码问题
2011/03/13 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
python中scipy.stats产生随机数实例讲解
2021/02/19 Python
音乐表演专业毕业生求职信
2013/10/14 职场文书
物业门卫岗位职责
2013/12/28 职场文书
计划生育诚信协议书
2014/11/02 职场文书
个人汇报材料范文
2014/12/30 职场文书
售票员岗位职责
2015/02/15 职场文书
护士求职自荐信
2015/03/25 职场文书
小学生手册家长意见
2015/06/03 职场文书
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang
基于Golang 高并发问题的解决方案
2021/05/08 Golang
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
SpringBoot详解执行过程
2022/07/15 Java/Android