V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
dzdh
V2EX  ›  Go 编程语言

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

  •  
  •   dzdh · 2022-05-10 23:22:10 +08:00 · 1674 次点击
    这是一个创建于 928 天前的主题,其中的信息可能已经有所发展或是发生改变。

    详细描述应该是 怎么定义公共的全局模板变量,比如全局的 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 }} 得到当前的时间戳
    
    13 条回复    2022-05-21 11:50:33 +08:00
    Carseason
        1
    Carseason  
       2022-05-10 23:26:24 +08:00 via Android
    ctx.Set()
    dzdh
        2
    dzdh  
    OP
       2022-05-10 23:59:40 +08:00
    @Carseason

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

    // x.html
    {{.test}}

    并没有值
    Carseason
        3
    Carseason  
       2022-05-11 00:39:16 +08:00 via Android
    再用 ctx.HTML 写入到模板变量里
    xcsoft
        4
    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
        5
    dzdh  
    OP
       2022-05-11 01:17:51 +08:00
    @Carseason
    @xcsoft

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

    - -
    Maboroshii
        6
    Maboroshii  
       2022-05-11 02:17:14 +08:00 via Android
    明天上班了告诉你 我好像做过这个
    JohnH
        7
    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
        8
    dzdh  
    OP
       2022-05-11 10:26:15 +08:00
    @JohnH 这是通过自定义模板方法。。那 seotitle 我一个方法,title 我一个方法。。。还有更简洁的吗
    llys
        9
    llys  
       2022-05-20 15:50:49 +08:00
    @Maboroshii 9 天过去了...
    dzdh
        10
    dzdh  
    OP
       2022-05-20 18:00:36 +08:00
    @llys 本来想实现 gin 的 render 接口自己实现个 render 把 ctx 里的内容拿出来,但是 gin.render 并没有在 render 阶段提供 ctx 。。
    Maboroshii
        11
    Maboroshii  
       2022-05-20 23:53:55 +08:00 via Android
    @llys 喔我忘啦哈哈哈哈,明天有空看看
    Maboroshii
        12
    Maboroshii  
       2022-05-21 07:30:21 +08:00
    我们用的 pongo2 模板, 可以在模板内使用全局信息
    pongo2Render, _ := pongo2gin.NewRenderer("public/views")
    pongo2Render.TplSet.Globals = pongo2.Context{
    "foo": "bar"
    }
    dzdh
        13
    dzdh  
    OP
       2022-05-21 11:50:33 +08:00
    @Maboroshii 额。也是个招,压根儿就不用 gin 的模板。哈哈哈哈哈哈哈。

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

    比如 gin.Use(func() { other_tmpl.Context('x', user.id). 如果两个用户的并发请求怎么控制呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2794 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:41 · PVG 17:41 · LAX 01:41 · JFK 04:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.