Gin(三):模板tmpl

(Golang) Gin 模板语法 在编写 Gin 应用程序时,有三种方式使用模板引擎:函数、render.HTML 中间件和 gin.Context.HTML方法。以上是关于 Gin 模板引擎的简单介绍和使用方法,掌握了这些基本特性和用法之后,可以在 Gin 应用程序的开发中使用模板引擎实现更高效的 Web 开发。学习目标:了解 Gin 模板引擎的基本特性和常用语法,掌握在 Gin 框架中使用模板引擎的方法。Gin 模板支持嵌入式模板,可以将一个模板嵌入另一个模板中,从而实现代码的重用。和 Go 模板一样,使用 `{{` 和 `}}`。 阅读详情

前面的学习已经对 Gin 有了一个初步的认识和了解,对 router 的简单使用也有了一定的掌握,那么今天就来使用 Gin 来渲染出我们的 html 页面吧。

?添加模板

我们仍旧是在上一章节的项目中进行修改。

首先新建一个 templates 文件夹,用于存放我们的模板文件,在文件夹中新建立 index.tmpl。并且编写我们的模板。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Gin Hello</title>
</head>
<body>
<main>{{ .title }}</main>
</body>
</html>

小提示 GoLand 现在还未对 tmpl 有高亮显示语法,我们可以将 .tmpl 后缀文件添加到 go Template 模板。方法如下:File-settings-Editor-File Types。(或者我们直接使用 *.gohtml 做为模板也是可以的)如图:

添加模板

我们可以通过 LoadHTMLGlob 和 LoadHTMLFiles 两个方法来对我们的模板进行加载。其中 LoadHTMLGlob 方法可以将一个目录下所有的模板进行加载,而LoadHTMLFiles只会加载一个文件,他的参数为可变长参数,需要我们一个一个的手动将模板文件填写。这里我们使用 LoadHTMLGlob 方法。

router.LoadHTMLGlob("templates/*")

此时我们需要修改我们的 / 路由了,不再是让它返回一个字符串,而是返回我们的页面模板。

在 handler 中新建立一个 indexHandler.go ,用来处理我们的 / 路由。

func Index(context *gin.Context) {
	context.HTML(http.StatusOK, "index.tmpl", gin.H{
		"title": "hello gin " + strings.ToLower(context.Request.Method) + " method",
	})
}

此时在访问我们的页面,仍旧是 hello gin get method,但是这和我们之前返回的字符串是不同的。

打开 浏览器-Network 就可以看到这两个页面的不同,一个是 text 一个是 html

写完具体功能,我们需要改造一下我们的单元测试,针对新的接口逻辑原有的单元测试已经行不通了。

重新修改单元测试。

func TestIndexHtml(t *testing.T) {
	router := initRouter.SetupRouter()
	w := httptest.NewRecorder()
	req, _ := http.NewRequest(http.MethodGet, "/", nil)
	router.ServeHTTP(w, req)
	assert.Equal(t, http.StatusOK, w.Code)
}

进行单元测试的时候,发现报错了,报错原因是竟然是找不到 html。

--- FAIL: TestIndexGetRouter (0.00s)
panic: html/template: pattern matches no files: `templates/*` [recovered]
	panic: html/template: pattern matches no files: `templates/*`

此时就感到很奇怪了,为什么网页上可以很好的访问到,在测试中却无法访问呢?

查了很多资料没有找到原因,很多解决方法是将 templates 写成全路径,这显然不是很好的解决方法。官方对于单元测试介绍少的可怜。

这里我介绍一种方法:

我们需要修改方法,通过判断不同的模式(debug,release,test)来加载不同路径下的 templates。

initRouter.go

// 省略部分代码	
if mode := gin.Mode(); mode == gin.TestMode {
    router.LoadHTMLGlob("./../templates/*")
} else {
    router.LoadHTMLGlob("templates/*")
}

同时,也需要修改 test,我们要写个 init 方法,这里的 init 方法就好比 java 中 Junit 中的 @Before

package test

import (
	"GinHello/initRouter"
	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/assert"
	"net/http"
	"net/http/httptest"
	"testing"
)

var router *gin.Engine

func init() {
	gin.SetMode(gin.TestMode)
	router = initRouter.SetupRouter()
}

func TestIndexHtml(t *testing.T) {
	w := httptest.NewRecorder()
	req, _ := http.NewRequest(http.MethodGet, "/", nil)
	router.ServeHTTP(w, req)
	assert.Equal(t, http.StatusOK, w.Code)
	assert.Contains(t,w.Body.String(),"hello gin get method","返回的HTML页面中应该包含 hello gin get method")
}

这样完善了单元测试,方便日后的功能更改。

✨添加静态资源

当网页可以正常显示的时候,我们可以添加一些静态资源来使我们的页面更加美观。我在这里选择了 Bootstrap 4 做为一个 UI 界面框架。Bootstrap 4 下载

同时还要引入 Jquery 和 Popper。

我们新建一个 statics 文件夹,将我们 Bootstrap 解压,将 js 和 css 复制到 statics 目录下。

在我们的 initRouter 中,对静态资源进行添加。

router.Static("/statics","./statics")

新建 header.tmpl

{{ define "header" }}
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <a class="navbar-brand" href="#">Gin Hello</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
                aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>

        <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav mr-auto">
                <li class="nav-item active">
                    <a class="nav-link" href="#">主页 <span class="sr-only">(current)</span></a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">文章列表</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link " href="#" tabindex="-1" aria-disabled="true">关于</a>
                </li>
            </ul>
            <form class="form-inline my-2 my-lg-0">
                <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
                <button class="btn btn-outline-success my-2 my-sm-0" type="submit">搜索</button>
            </form>
            <ul class="navbar-nav ">
                <li class="nav-item">
                    <a class="nav-link" href="#">登录</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">注册</a>
                </li>
            </ul>
        </div>
    </nav>
{{end}}

并在我们的 index.tmpl 上进行添加

<body>
<header>
    {{template "header"}}
</header>
<main>
    {{ .title }}
</main>
</body>

此时运行我们的网站,出现下图样式。

?添加网站图标

万事俱备,只欠一个 icon。

网站此时还缺少网站的图标,网站图标也是通过 Gin 给定的函数设置。我们将 .ico 图片放到项目根目录下,然后在 initRouter 中设置。

router.StaticFile("/favicon.ico","./favicon.ico")

再次运行我们的网站,此时就会发现网站的左上角标签页中出现了设置好的图标。

✍总结

通过本章节的介绍和学习,可以很快的使用 Gin 中的静态资源,定义网站图标等。

?‍?本章节代码

Github

个人公众微信号

文章与个人公众号同步更新,欢迎各位扫码关注。

在这里插入图片描述

Gin框架中的模板渲染问题与解决方案 本文分析了使用Gin框架开发Web应用时遇到的模板渲染问题。当多个页面继承同一基模板时,会导致模板名称冲突,只有部分视图能正确渲染。解决方案是放弃基模板继承,改为在每个页面中直接组合头部和尾部模板。虽然这会增加少量代码冗余,但能确保所有视图正确渲染,提高可维护性。文章通过具体项目结构和代码示例,展示了如何重构模板来解决这一问题,为开发者提供了实用的参考方案。 阅读详情

相关推荐

Go语言之Gin框架,引用多个HTML文件,并引用函数,解析html代码

继上一篇博客,添加解析html的函数 实现在go语言中的html代码转化,添加一个函数即可 在tmpl文件中新增safe字段 main.go内容 package main import ( "github.com/gin-gonic/gin" "html/template" "net/http" ) func main() { //定义一个路由 r := gin.Default() //新增解析html的函数 r.SetFuncMap(template.FuncMap{ "safe

CN_Eden 1479

Gin框架中让tmpl模板文件有语法提示

Gin框架中让tmpl模板文件有语法提示 在Gin中,我们要使用 .tmpl 结尾的模板文件,但是我们在new的时候,发现没有对应的文件,所以它就会被当成普通的文件来进行解析,因此也没有提示,这对我们使用goland来开发,是非常痛苦的事情。

行走的皮卡丘 2200

别再死磕U-Net了!用PyTorch手把手教你搭建ResUnet,搞定医学图像分割(附完整代码)

本文详细介绍了如何利用PyTorch搭建ResUnet模型,通过引入残差连接解决医学图像分割中的梯度消失、特征退化和细节丢失问题。与传统U-Net相比,ResUnet在Dice系数和收敛速度上均有显著提升,特别适合处理脑部MRI等复杂医学图像。文章还提供了完整的代码实现和关键训练技巧,帮助开发者快速掌握这一先进技术。

weixin_42552637的博客 327

gin模板渲染和template【选修】(适用于个人前后端不分离的项目)

定义模板文件时需要我们按照模板语言语法规则去编写(如,django的模板语法,flask的jinjia2语法)

General_zy的博客 2377

【亲测】ubuntu20.4 安装CUDA11.8

一步一步搭建C++ CUDA CUDNN TENSORRT OPENCV DNN ONNXRUNTIME推理环境

weixin_40950590的博客 3896

扫码器USB键盘报告描述符数据格式解析

Byte0用于判断Shift是否按下,当按下时Byte0的Bit1会置1,即0x02,若未按下,Bit为0,即0x00。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>未按下Shift。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>按下Shift。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出A。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出a。

m0_65548585的博客 1142

goland设置Gin框架中tmpl模板的语法提示的方法

在Gin中,我们要使用.tmpl结尾的模板文件,但是我们在new的时候,发现没有对应的文件,所以它就会被当成普通的文件来进行解析,因此也没有提示,这对我们使用goland来开发,是非常痛苦的事情。

yonggeit的博客 3721

Arduino与震动马达模块握手

震动马达模块采用采用高品质手机震动马达,适用于震动感互动产品的制作,可穿戴智能设备震动提醒,适合作为非可听指示器的小型振动马达。当输入为高电平时电动机会震动,就像你的静音模式的手机一样。

vor234的博客 5848

scrapy startproject 创建XXX.tmpl文件

scrapy startproject 创建XXX.tmpl文件

weixin_44428474的博客 497

Qt 国产嵌入式操作系统实现文字转语音功能(ekho库)

Qt 国产嵌入式操作系统实现文字转语音功能(TTS)_tts驱动 转文字-优快云博客在继上篇文章之后,甲方粑粑不满意使用eSpeak发出的声音太难听了,这就不得不找个替代品,声音稍微好听了一些。使用ekho开源库。Ekho(余音)是一个免费、开源的中文语音合成软件。它目前支持粤语、普通话(国语)、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英文则通过Festival间接实现。Ekho支持Linux、Windows和Android平台。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2755

PyTorch视觉项目实战:从数据加载到模型部署

PyTorch视觉项目实战:从数据加载到模型部署 ,人工智能,计算机视觉,大模型,AI,随着深度学习在计算机视觉领域的飞速发展,PyTorch 凭借其简洁的代码风格、动态计算图特性以及强大的社区支持,成为众多开发者和研究人员的首选框架。从数据加载、模型构建与训练,到最终的模型部署,PyTorch 提供了一套完整且灵活的解决方案。本文将通过实际项目案例,详细阐述基于 PyTorch 的视觉项目全流程,结合丰富的代码示例和概念解析,帮助读者掌握从项目起步到落地的关键技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

jQuery-tmpl模板引擎使用详解

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、博主微信(guyun297890152)、QQ技术交流群(183198395)。 动态请求数据来更新页面是现在非常常用的方法,服务器端通常返回的json格式的数据,如果我们手动的去拼装HTML将是一件非常麻烦的事,而且非常容易出错,因此一些用模版生成HTML的的框架相继出现,jQuery-tmp...

孤云博客 1万+

Navicat从入门到精通:数据库管理全攻略

本文系统梳理Navicat数据库管理工具的核心应用体系。从基础的安装与多类型数据库连接入手,详解数据库与数据表的创建、修改、删除等操作逻辑;深入数据增删改查的可视化与 SQL 语句双重操作模式,结合Excel/SQL文件的导入导出场景提供实操指南。同时覆盖数据备份恢复、跨库同步等进阶功能,以及视图、存储过程等高级应用。通过对比同类工具突出Navicat的易用性与功能性优势,并针对连接失败、字符乱码等常见问题提供解决方案,帮助读者从零基础掌握数据库全生命周期管理,提升数据操作效率与安全性。

邓邓子的博客 1897

Gin(三):配合模板 Tmpl

点击蓝字关注我原文首发于 https://youngxhui.top前面的学习已经对 Gin 有了一个初步的认识和了解,对router的简单使用也有了一定的掌握,那么今天...

代码猎奇站 1286

深入剖析 Hive 中 CASE WHEN 与 IF 函数的性能差异:解锁高效数据处理的关键

CASE WHEN 函数堪称 Hive 中条件判断的多面手,它具备两种强大的语法形式,以应对各种复杂的业务逻辑。简单 CASE 表达式这种形式适用于对某一列的值进行直接的条件匹配。其语法如下:END例如,我们有一个记录学生成绩的表CASE scoreELSE 'D'搜索 CASE 表达式当业务逻辑需要更灵活的条件判断时,搜索 CASE 表达式便派上用场。它的语法为:CASEENDCASEELSE 'D'

2401_83088008的博客 1125

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

gin 如何返回html_Gin(三):与模板配合使用 tmpl,go web 开发最火框架之一

经过Gin(二):路由Router ,go语言框架学习的学习,已经对 Gin 有了一个初步的认识和了解,对 router 的简单使用也有了一定的掌握,那么今天就来使用 Gin 来渲染出我们的 html 页面吧。添加模板我们仍旧是在上一章节的项目中进行修改。首先新建一个 templates 文件夹,用于存放我们的模板文件,在文件夹中新建立 index.tmpl。并且编写我们的模板。 Gi...

weixin_39834745的博客 1382

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

gin框架学习

一个go语言的web框架Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。import ("fmt""net/http""time"name, ok := c.Get("name") //跨中间件取值if!ok {name = "匿名用户"})// 定义一个中间件,统计处理函数的耗时//计时c.Next() //调用后续的处理函数。

weixin_55418082的博客 1207

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

gin框架模板渲染

这里演示的是同时渲染两个模板的,一个模板也是类似的首先看目录结构</</</</</</</</ginDemo.go。

weixin_51656756的博客 200

gin框架 访问报错html/template: "users/index.tmpl" is undefined panic: template: index.tmpl:13: unexpectecd

参考博客: Golang 开发框架 gin 项目时笔记 如果非要按照官方文档,请注意模板文件开头一定要定义 {{ define "posts/index.tmpl" }} <html><h1> {{ .title }} </h1> <p>Using posts/index.tmpl</p> </html> {{ end }}...

可控的事情要谨慎,不可控的事情要乐观。 3666

全网最强 Gin 教程 | 模板响应

本文介绍了Golang中Gin框架的模板渲染功能,主要包括四个部分:1)基本使用方法,包括模板定义和渲染;2)多模板文件的批量渲染方式;3)自定义模板函数的实现,如安全输出HTML内容;4)静态文件处理,包括CSS文件的引入和配置。通过示例代码展示了如何加载模板、渲染数据、注册自定义函数以及设置静态文件目录,帮助开发者快速掌握Gin框架的模板功能。全文以实践为导向,提供完整的代码片段和文件结构参考。

qq_45832461的博客 48

使用Gin的模板嵌套时遇到一直模板未定义的情况

出现此报错是因为我想在main.tmpl中嵌套其他模板。

Erictr的博客 245

Gin框架(上)

Gin模板,Gin返回参数,Gin获取参数

qq_53267860的博客 351

IDM 试用期到期怎么办?IDM 激活脚本冻结与重置的完整用法

IDM 的 30 天试用期突然到期,排队中的大文件下载全被拦下,弹出注册窗口要钱。IDM 激活脚本(IAS)把试用期相关的注册表键值设为只读,让倒计时停在原地,也可以随时重置回初始状态。 ## 功能速览:冻结、重置与激活各管一摊 整个项目核心就是 [IAS.cmd](https://link.gitcode.com/i/8e9623c5ed74d6478711c2a44ab31607) 这个批

gitblog_00354的博客 438

使用 oapi-codegen 从 OpenAPI 3 规范生成 Gin 服务器端样板代码

`oapi-codegen` 是一款将 OpenAPI 3.0 / 3.1 规范转换为 Go 代码的命令行工具与库,支持生成服务器端样板、API 客户端以及 HTTP 模型。本文以 [docs/gin-server.md](https://link.gitcode.com/i/13d318b84fe35c5dcf9d4b2a7bab1c01) 为核心,完整讲解如何基于 Gin(gin-gonic/

gitblog_00558的博客 413

github.com/gin-contrib/multitemplate

【代码】github.com/gin-contrib/multitemplate。

skipI的博客 178

gin获取form表单提交的参数

点击登录后提交表单,就相当于是以post方式访问localhost:9090/login1,然后结果为。输入localhost:9090/login后,会得到login.html渲染的表单。

weixin_51656756的博客 441
上一篇: Gin(二):路由Router
下一篇: Gin(四):表单提交校验和模型绑定
代码猎奇站
博客等级 码龄7年 39粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值