Golang Go语言中 Gin 如何让通过中间件设置的变量 在模板中能读取到

发布于 1周前 作者 sinazl 来自 Go语言

详细描述应该是 怎么定义公共的全局模板变量,比如全局的 webtitle 、seotitle 等

router := gin.Default()

router.use(func (ctx *gin.Context) { // if user.isLogged() // 怎么才能设置一个变量或值,让模板中可以读到 // endif })

如 fiber 可以这样:

app.Use(func(ctx *fiber.Ctx) error {
	_ = ctx.Bind(fiber.Map{
		"t": time.Now().UnixNano(),
	})
	return ctx.Next()
})

app.Get("/", func(ctx *fiber.Ctx) error { return ctx.Render(“tmpl_name”, fiber.Map{ }) })

// 模板中可以 {{ .t }} 得到当前的时间戳


Golang Go语言中 Gin 如何让通过中间件设置的变量 在模板中能读取到

更多关于Golang Go语言中 Gin 如何让通过中间件设置的变量 在模板中能读取到的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

ctx.Set()

更多关于Golang Go语言中 Gin 如何让通过中间件设置的变量 在模板中能读取到的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html




ctx.Set(“test”,“test_value”)

// x.html
{{.test}}

并没有值

再用 ctx.HTML 写入到模板变量里

中间件中 通过 c.Set(“test”,“testvalue”) 设置参数

go<br>app.Get("/", func (c *gin.Context){<br> test := c.GetString("test")<br><br>})<br>
这样取出参数,




这要是有几十上百个路由 ,写几十上百次的 gin.H{XX:ctx.Get(“XX”) ??

- -

明天上班了告诉你 我好像做过这个

[Golang Gin Middleware pass Data to Template]( https://stackoverflow.com/questions/71229454/golang-gin-middleware-pass-data-to-template)
google:gin template middleware

这是通过自定义模板方法。。那 seotitle 我一个方法,title 我一个方法。。。还有更简洁的吗

9 天过去了…

本来想实现 gin 的 render 接口自己实现个 render 把 ctx 里的内容拿出来,但是 gin.render 并没有在 render 阶段提供 ctx 。。

喔我忘啦哈哈哈哈,明天有空看看

我们用的 pongo2 模板, 可以在模板内使用全局信息
pongo2Render, _ := pongo2gin.NewRenderer(“public/views”)
pongo2Render.TplSet.Globals = pongo2.Context{
“foo”: “bar”
}

额。也是个招,压根儿就不用 gin 的模板。哈哈哈哈哈哈哈。

有个新问题,在并发请求中动态设置值会乱吗?详细咋用的呢?

比如 gin.Use(func() { other_tmpl.Context(‘x’, user.id). 如果两个用户的并发请求怎么控制呢?

在Go语言的Gin框架中,如果你想通过中间件设置的变量在模板中读取到,可以通过Gin的上下文(context)来实现。Gin的上下文在请求的生命周期内传递,你可以在其中存储和访问数据。以下是一个简单的示例,展示了如何实现这一功能:

  1. 定义中间件:在中间件中,你可以将变量存储到Gin的上下文中。
func myMiddleware(c *gin.Context) {
    // 设置变量到上下文中
    c.Set("myVar", "Hello, Template!")
    c.Next()
}
  1. 注册中间件:在路由中使用这个中间件。
r := gin.Default()
r.Use(myMiddleware)
  1. 在模板中读取变量:在Gin的模板中,你可以通过html/template的自定义函数或者通过模板引擎的上下文访问功能来读取这些变量。但Gin更常见的是将上下文数据传递给模板时,通过c.HTML方法的第二个参数(一个map[string]interface{})来传递。

    你可以在处理函数中这样做:

func handler(c *gin.Context) {
    myVar := c.Get("myVar")
    c.HTML(http.StatusOK, "index.tmpl", gin.H{
        "myVar": myVar,
    })
}
  1. 在模板中使用变量
<!DOCTYPE html>
<html>
<head>
    <title>My Page</title>
</head>
<body>
    <p>{{.myVar}}</p>
</body>
</html>

这样,你就可以在模板中读取到通过中间件设置的变量了。

回到顶部