gpt4 book ai didi

go - 如何在 Go 中自动将数据传递给模板?

转载 作者:数据小太阳 更新时间:2023-10-29 03:16:33 27 4
gpt4 key购买 nike

现在我正在使用 Gorilla context包在我的中间件和 Controller 中传递数据,但我想做的是将数据直接传递到我的 Pongo2模板,所以稍后在我的 Controller 中,我不必从 Gorilla 上下文中获取数据并将其手动传递给模板上下文,对于那些熟悉 express.js 的人来说,这就像

var user = {
name: "Name",
age: 0
}

response.locals = user

编辑:所以每个 pongo2 模板都需要访问一个 User 对象,现在我使用中间件从数据库中获取用户并使用 Gorilla 上下文将数据传递到我的 Controller ,从那里传递到每个 Controller 上的我的模板,但我想要什么要做的是将用户对象从我的中间件传递到模板,而不是使用 Gorilla 上下文。

func UserMiddleware(next http.HandlerFunc) http.HandlerFunc {
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {

user := &User{} // user will normally be fetched from database
context.Set(req, "user", user)
next.ServeHTTP(res, req)
})
}

然后在我的请求处理程序中

func Handler(res http.ResponseWriter, req *http.Request) {
tpl, _ := pongo2.FromFile("view/template.html")
user := context.Get(req, "user").(*User)
data := pongo2.Context{
"user": user,
}
out, _ := tpl.Execute(data)
res.Write([]byte(out))
}

对于我所有的处理程序,我必须像那样将用户传递给模板,但我想从我的中间件传递它,这样我就不必在我的每个处理程序中都这样做。

最佳答案

调用 MyExecute(req, tpl) 而不是 tpl.Execute(data)

func MyExecute(req *http.Request, tpl TemplateSet) (string, error){
gorillaObj := context.GetAll(req)
pongoObj := make(map[string]interface{})

for key, value := range gorillaObj {
if str, ok := key.(string); ok{
pongoObj[str] = value
}
}

return tpl.Execute(pongo2.Context(pongoObj))
}

未测试,应该可以。最大的问题是 gorilla 使用 map[interface{}]interface{} 作为存储,而 pongo 使用 map[string]interface{},注意不要使用非字符串作为 gorilla 上下文中的键。

关于go - 如何在 Go 中自动将数据传递给模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32493677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com