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

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

正常情况下 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.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 渲染器:

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()

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-26 01:42:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-26 01:42:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-26 01:42:01       82 阅读
  4. Python语言-面向对象

    2024-04-26 01:42:01       91 阅读

热门阅读

  1. 仿真-Carla初识-运行

    2024-04-26 01:42:01       33 阅读
  2. Redis学习(三)| Redis高可用和容错机制详解

    2024-04-26 01:42:01       33 阅读
  3. 华纳云:怎么防止租用服务器的数据丢失?

    2024-04-26 01:42:01       30 阅读
  4. 人大金仓数据库的内容和目的

    2024-04-26 01:42:01       29 阅读
  5. 基于token进行登录,每次请求携带token

    2024-04-26 01:42:01       32 阅读
  6. oracle_申明与赋值

    2024-04-26 01:42:01       34 阅读
  7. 成为程序员后你都明白了什么?

    2024-04-26 01:42:01       35 阅读
  8. 【课设资源分享】基于jsp的俱乐部会员系统

    2024-04-26 01:42:01       35 阅读
  9. Ubuntu22.04.4 - SSH - 笔记

    2024-04-26 01:42:01       26 阅读
  10. Beego框架相关内容

    2024-04-26 01:42:01       32 阅读