为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
收到一只叮咚 2021-11-08 14:35:45
现在我正在使用Gorilla 上下文包在我的中间件和控制器中传递数据,但我想要做的是将数据直接传递给我的Pongo2模板,以便稍后在我的控制器中我不必从 Gorilla 获取数据上下文并手动将其传递给模板上下文,对于那些熟悉 express.js 的人来说,它会像var user = {    name: "Name",    age: 0}response.locals = user编辑:所以每个 pongo2 模板都需要访问一个 User 对象,现在我使用中间件从数据库中获取用户并使用 Gorilla 上下文将数据传递给我的控制器,从那里到我的每个控制器上的模板,但我想要做的是将 User 对象从我的中间件传递给模板,而不是使用 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))}对于我所有的处理程序,我必须像这样将用户传递给模板,但我想从我的中间件传递它,这样我就不必在每个处理程序中都这样做。
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

调用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))

}

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


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信