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

2022-05-10 23:22:10 +08:00
 dzdh

详细描述应该是 怎么定义公共的全局模板变量,比如全局的 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 }} 得到当前的时间戳
1672 次点击
所在节点    Go 编程语言
13 条回复
Carseason
2022-05-10 23:26:24 +08:00
ctx.Set()
dzdh
2022-05-10 23:59:40 +08:00
@Carseason

ctx.Set("test","test_value")

// x.html
{{.test}}

并没有值
Carseason
2022-05-11 00:39:16 +08:00
再用 ctx.HTML 写入到模板变量里
xcsoft
2022-05-11 00:46:42 +08:00
中间件中 通过 c.Set("test","testvalue") 设置参数

``` go
app.Get("/", func (c *gin.Context){
test := c.GetString("test")

})
```
这样取出参数,
dzdh
2022-05-11 01:17:51 +08:00
@Carseason
@xcsoft

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

- -
Maboroshii
2022-05-11 02:17:14 +08:00
明天上班了告诉你 我好像做过这个
JohnH
2022-05-11 09:07:40 +08:00
[Golang Gin Middleware pass Data to Template]( https://stackoverflow.com/questions/71229454/golang-gin-middleware-pass-data-to-template)
google:gin template middleware
dzdh
2022-05-11 10:26:15 +08:00
@JohnH 这是通过自定义模板方法。。那 seotitle 我一个方法,title 我一个方法。。。还有更简洁的吗
llys
2022-05-20 15:50:49 +08:00
@Maboroshii 9 天过去了...
dzdh
2022-05-20 18:00:36 +08:00
@llys 本来想实现 gin 的 render 接口自己实现个 render 把 ctx 里的内容拿出来,但是 gin.render 并没有在 render 阶段提供 ctx 。。
Maboroshii
2022-05-20 23:53:55 +08:00
@llys 喔我忘啦哈哈哈哈,明天有空看看
Maboroshii
2022-05-21 07:30:21 +08:00
我们用的 pongo2 模板, 可以在模板内使用全局信息
pongo2Render, _ := pongo2gin.NewRenderer("public/views")
pongo2Render.TplSet.Globals = pongo2.Context{
"foo": "bar"
}
dzdh
2022-05-21 11:50:33 +08:00
@Maboroshii 额。也是个招,压根儿就不用 gin 的模板。哈哈哈哈哈哈哈。

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/852086

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX