Golang 语言 Web 框架 beego v2 之模板(上)

简介: Golang 语言 Web 框架 beego v2 之模板

01

介绍


beego 的模板处理引擎采用的是 Go 内置的 html/template 包进行处理,而且 beego 的模板处理逻辑是采用了缓存编译方式,也就是所有的模板会在 beego 应用启动的时候全部编译然后缓存在 map 里面。


02

模板处理

模板目录


beego 的默认模板目录是 views,也可以通过 beego.ViewPath = "viewPath" 指定模板目录。beego 会自动解析并缓存模板目录中的所有模板文件。但是在开发模式下,每次修改模板文件都会重新解析,并且不做缓存。


自动渲染


beego 会在调用完相应 method 方法之后自动调用 Render 函数,不需要用户手动调用渲染输出模板。如果不需要模板输出,可以在配置文件中配置:

autorender=false

或在 main.go 文件中设置配置变量:

web.AutoRender = false


模板标签


beego 默认使用{{}}双大括号作为模板标签,但是可能会和某些模板引擎使用的标签冲突,beego 可以通过配置文件或者设置配置变量:


web.TemplateLeft="<<"
web.TemplateRight=">>"


模板数据


模板数据是通过在 controller中 this.Data 获取的,Data 字段的类型是:


Data map[interface{}]interface{}

key 和 value 都是空接口类型的 map


模板名称


自动渲染模式中,如果没有在 controller 中没有设置任何的模板名称TplName,beego 会自动将 controller 名字,method 名字,和模板后缀拼接成一个字符串,作为模板名称。


c.TplName = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt


beego 默认支持两种模板文件的后缀名,分别是 tpl 和 html。如果你的模板文件的后缀名不是这两种,需要设置配置变量:

web.AddTemplateExt("模板文件的后缀名")


用户还可以在 controller 中指定模板名称,beego 会自动在 viewPath 目录中查找该模板文件,设置方式如下:


this.TplName = "admin/add.tpl"


Layout 设计


beego 支持 Layout 设计,可以通过如下设置:


this.Layout = "admin/layout.html"
this.TplName = "admin/add.tpl"


在 layout.html 文件中,设置如下变量:


{{.LayoutContent}}


beego 就会首先解析 TplName 指定的文件,获取到内容后,赋值给 LayoutContent,最后渲染 layout.html 文件。


另外,还可以使用如下方式:


{{template "header.html" .}}
Logic code
{{template "footer.html" .}}


LayoutSection


根据惯例,js 文件放在 body 的末尾,css 文件放到 head 中,所以 layout.html 文件只有一个 LayoutContent 是不够用的。


所以,在 controller 中还有一个 LayoutSection 属性,可以给 Layout.html 设置多个 section,每个 section 都可以包含各自的子模板页面。



type BlogsController struct {
  web.Controller
}
func (this *BlogsController) Get() {
  this.Layout = "layout_blog.tpl"
  this.TplName = "blogs/index.tpl"
  this.LayoutSections = make(map[string]string)
  this.LayoutSections["HtmlHead"] = "blogs/html_head.tpl"
  this.LayoutSections["Scripts"] = "blogs/scripts.tpl"
  this.LayoutSections["Sidebar"] = "blogs/side_bar.tpl"
}


renderform 使用


struct:


type User struct {
  Id    int         `form:"-"`
  Name  interface{} `form:"username"`
  Age   int         `form:"age,text,年龄:"`
  Sex   string
  Intro string `form:",textarea"`
}


StructTag 的定义用的标签为 form,和 ParseForm 方法共用一个标签,标签后面有三个可选参数,用 , 分割。


第一个参数为表单中类型的 name 的值,如果为空,则以 struct field name 为值。


第二个参数为表单组件的类型,如果为空,则为 text。表单组件的标签默认为 struct field name 的值,否则为第三个值。


如果要忽略一个字段,有两种办法,一是:字段名小写开头,二是:form 标签的值设置为 -


如果 form 标签只有一个值,则为表单中类型 name 的值,除了最后一个值可以忽略外,其他位置的必须要有 ,号分割,如:form:",,姓名:"


现在的代码版本只能实现固定的格式,用 br 标签实现换行,无法实现 css 和 class 等代码的插入。所以,要实现 form 的高级排版,不能使用 renderform 的方法,而需要手动处理每一个字段。


controller:


func (this *AddController) Get() {
  this.Data["Form"] = &User{}
  this.TplName = "index.tpl"
}


Form 的参数必须是一个 struct 的指针。


template:

<form action="" method="post">
{{.Form | renderform}}
</form>


上面的代码生成的表单为:


Name: <input name="username" type="text" value="test"></br>
年龄:<input name="age" type="text" value="0"></br>
Sex: <input name="Sex" type="text" value=""></br>
Intro: <input name="Intro" type="textarea" value="">


03

模板语法


模板中支持的 go 语言符号



{{"string"}} // 一般 string
{{`raw string`}} // 原始 string
{{'c'}} // byte
{{print nil}} // nil 也被支持


模板中的 pipeline


可以是上下文的变量输出,也可以是函数通过管道传递的返回值


{{. | FuncA | FuncB | FuncC}}


当 pipeline 的值 false 或 0,nil 的指针或 interface,长度为 0 的 array、slice、map、string,那么这个 pipeline 被认为是空。


if ... else ... end



{{if pipeline}}{{end}}


if 判断时,pipeline 为空时,相当于判断为 false


this.Data["IsLogin"] = true
this.Data["IsHome"] = true
this.Data["IsAbout"] = true


支持嵌套的循环


{{if .IsHome}}
{{else}}
  {{if .IsAbout}}{{end}}
{{end}}


也可以使用 else if


{{if .IsHome}}
{{else if .IsAbout}}
{{else}}
{{end}}


range ... end



{{range pipeline}}{{.}}{{end}}

pipeline 支持的类型为 array,slice,map,channel


range 循环内部的「.」改变为以上类型的子元素


对应的值长度为 0 时,range 不会执行,「.」不会改变



pages := []struct {
  Num int
}{{10}, {20}, {30}}
this.Data["Total"] = 100
this.Data["Pages"] = pages


使用「.Num」输出子元素的 Num 属性,使用「$.」引用模板中的根级上下文


{{range .Pages}}
  {{.Num}} of {{$.Total}}
{{end}}


使用创建的变量,在这里和 go 中的 range 用法相同


{{range $index, $elem := .Pages}}
  {{$index}} - {{$elem.Num}} - {{.Num}} of {{$.Total}}
{{end}}

range 也支持 else


{{range .Pages}}
{{else}}
  {{/* 当 .Pages 为空 或者 长度为 0 时会执行这里 */}}
{{end}}


with ... end


{{with pipeline}}{{end}}


with 用于重定向 pipeline


{{with .Field.NestField.SubField}}
  {{.Var}}
{{end}}


也可以对变量赋值操作


{{with $value := "My name is %s"}}
  {{printf . "slene"}}
{{end}}


with 也支持 else


{{with pipeline}}
{{else}}
  {{/* 当 pipeline 为空时会执行这里 */}}
{{end}}


define


define 可以用来定义自模板,可用于模块定义和模板嵌套


{{define "loop"}}
  <li>{{.Name}}</li>
{{end}}


使用 template 调用模板

<ul>
  {{range .Items}}
    {{template "loop" .}}
  {{end}}
</ul>


template



{{template "模板名" pipeline}}

将对应的上下文 pipeline 传给模板,才可以在模板中调用


beego 中支持直接载入文件模板



{{template "path/to/head.html" .}}


beego 会依据你设置的模板路径读取 head.html

在模板中可以接着载入其他模板,对于模板的分模块处理很有用处


注释


允许多行文本注释,不允许嵌套

{{/* comment content
support new line */}}



目录
相关文章
|
5月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
545 1
|
9月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
9月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
9月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
11月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
568 35
|
11月前
|
人工智能 自然语言处理 JavaScript
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
Magnitude是一个基于视觉AI代理的开源端到端测试框架,通过自然语言构建测试用例,结合推理代理和视觉代理实现智能化的Web应用测试,支持本地运行和CI/CD集成。
1617 15
测试工程师要失业?Magnitude:开源AI Agent驱动的端到端测试框架,让Web测试更智能,自动完善测试用例!
|
人工智能 开发框架 数据可视化
Eino:字节跳动开源基于Golang的AI应用开发框架,组件化设计助力构建AI应用
Eino 是字节跳动开源的大模型应用开发框架,帮助开发者高效构建基于大模型的 AI 应用。支持组件化设计、流式处理和可视化开发工具。
2101 27
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
729 67
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
450 2
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
1690 1

推荐镜像

更多