本文主要解决在多租户场景下的模板渲染问题。
正常情况下 Gin 配置的所有模板都属于同一个模板组合,相同名称的模板将相互覆盖。在未通过 define
指定模板名称时,同名模板文件也将相互覆盖。自定义函数中也无法区分租户,这将非常不方便我们进行多租户的模板渲染处理。通过自定义 HTML 渲染器,将一一解决这些问题。
一、Gin 源码分析
Gin 通过 router.LoadHTMLGlob
或 router.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.Left
right := 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 渲染器:文章来源:https://www.toymoban.com/news/detail-855635.html
HTMLDebug
渲染器与生产渲染器没有本质不同,只是将创建 template
模板的步骤放在了执行渲染时。执行渲染的接口源码如下:文章来源地址https://www.toymoban.com/news/detail-855635.html
// 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()
到了这里,关于GO 的 Web 开发系列(八)—— Gin 自定义 Html 渲染实现多租户的模板设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!