亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在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 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號