GO 的 Web 开发系列(八)—— Gin 自定义 Html 渲染实现多租户的模板设计

ops/2024/10/20 12:21:03/

本文主要解决在多租户场景下的模板渲染问题。

正常情况下 Gin 配置的所有模板都属于同一个模板组合,相同名称的模板将相互覆盖。在未通过 define 指定模板名称时,同名模板文件也将相互覆盖。自定义函数中也无法区分租户,这将非常不方便我们进行多租户的模板渲染处理。通过自定义 HTML 渲染器,将一一解决这些问题。

一、Gin 源码分析

Gin 通过 router.LoadHTMLGlobrouter.LoadHTMLFiles 函数初始化 HTML 模板,这两个函数的源码如下。

// LoadHTMLGlob loads HTML files identified by glob pattern
// and associates the result with HTML renderer.
func (engine *Engine) LoadHTMLGlob(pattern string) {left := engine.delims.Leftright := engine.delims.Right// 初始化模板templ := template.Must(template.New("").Delims(left, right).Funcs(engine.FuncMap).ParseGlob(pattern))if IsDebugging() {debugPrintLoadTemplate(templ)engine.HTMLRender = render.HTMLDebug{Glob: pattern, FuncMap: engine.FuncMap, Delims: engine.delims}return}engine.SetHTMLTemplate(templ)
}// LoadHTMLFiles loads a slice of HTML files
// and associates the result with HTML renderer.
func (engine *Engine) LoadHTMLFiles(files ...string) {if IsDebugging() {engine.HTMLRender = render.HTMLDebug{Files: files, FuncMap: engine.FuncMap, Delims: engine.delims}return}// 初始化模板templ := template.Must(template.New("").Delims(engine.delims.Left, engine.delims.Right).Funcs(engine.FuncMap).ParseFiles(files...))engine.SetHTMLTemplate(templ)
}

可以看到,这里面区分了 DEBUG 模式,DEBUG 模式的渲染器是 render.HTMLDebug,他将在每次渲染是重新创建模板,从而使模板修改能够实时生效。

DEBUG 渲染器:

HTMLDebug 渲染器与生产渲染器没有本质不同,只是将创建 template 模板的步骤放在了执行渲染时。执行渲染的接口源码如下:

// Instance (HTMLDebug) returns an HTML instance which it realizes Render interface.
func (r HTMLDebug) Instance(name string, data any) Render {return HTML{// 重新创建模板Template: r.loadTemplate()
gin:auto;margin-top:12px" class="blog-extension-box">

http://www.ppmy.cn/ops/15517.html

相关文章

ProtoBuf、Grpc、GORM、Go-redis 入门基础

一、ProtoBuf、Grpc ProtoBuf定义:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 说白了,可以将ProtoBuf文件 当作支持语言的代码交换工具 Grpc…

【前端】vue数组去重的3种方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数组去重说明二、Vue数组去重的3种方法 前言 随着开发语言及人工智能工具的普及,使得越来越多的人会主动学习使用一些开发工具,本文…

对观察者模式的理解

目录 一、场景1、题目描述 【[案例来源](https://kamacoder.com/problempage.php?pid1075)】2、输入描述3、输出描述4、输入示例5、输出示例 二、实现三、更复杂的场景 【[案例来源](https://refactoringguru.cn/design-patterns/observer/java/example#example-0--listeners-…

时间默认显示当前日期及系统时间

要将 xtdsSj 绑定到当前日期和系统时间&#xff0c;你可以在组件的 data 中初始化 xtdsSj 属性为当前日期及系统时间的字符串。然后&#xff0c;在组件创建时更新 xtdsSj&#xff0c;确保它始终显示当前日期和系统时间。 1.系统读数时间默认显示当前日期及系统时间 <templa…

自然语言生成软件!用码上飞CodeFlying来开发一个ChatBot

前言&#xff1a; 众所周知&#xff0c;2023年被称之为大模型的元年&#xff0c;随着ChatGPT的爆火&#xff0c;国内也涌现了诸多大模型的产品&#xff0c;从文生文、文生图片再到文生视频等多模态的应用成为了各家的主战场。但是在软件开发的领域&#xff0c;当前大部分的产品…

Flink Graph演变

1.概述 Flink 集群中运行的 Job&#xff0c;最终归根到底&#xff1a;还是构建一个高效能分布式并行执行的DAG执行图。一个 Flink 流式作业从 Client 提交到 Flink 集群到最后执行&#xff0c;总共经历 4 种状态&#xff0c;总体来说&#xff1a;Flink中的执行图可分成四层&…

使用excel文件生成sql脚本

目录 1、excel文件脚本变量2、公式示例 前言&#xff1a;在系统使用初期有一些基础数据需要从excel中导入到数据库中&#xff0c;直接导入的话可能有些字段用不上&#xff0c;所以就弄一个excel生成sql的导入脚本&#xff0c;这样可以将需要的数据填到指定的列即可生成sql。 1、…

Flask项目部署

1.debug模式 不用每次保存后重新运行&#xff08;热部署&#xff09; 看一下自己的ip ipconfig2.改host 可以让同一个局域网的人访问 3.修改port端口号 中间有空格