2015-09-10 26 views
0

現在我正在使用Gorilla context包在我的中間件&控制器中傳遞數據,但我想要做的是將數據直接傳遞給我的Pongo2模板,以便稍後在我的控制器中,我不必從數據庫中獲取數據大猩猩上下文並手動將其傳遞給模板背景下,對於那些你熟悉express.js它會像如何在Go中自動傳遞數據到模板?

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

response.locals = user 

編輯:所以每次pongo2模板需要訪問用戶對象,現在我獲取用戶從數據庫使用中間件和使用Gorilla上下文將數據傳遞到我的控制器,從那裏到每個控制器上的模板,但我想要做的是將User對象從我的中間件傳遞到模板o f使用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)) 
} 

對於我所有的處理程序我有用戶傳遞到模板這樣的,但我想從我的中間件通過它,這樣我不我不得不在每個處理程序中執行它。

+2

你正在使用兩個包Gorilla和Pongo,當然你需要編寫一些代碼將它們粘合在一起。或者請提出更具體的問題 –

+0

我已更新問題 – zola

+0

不得不從上下文中拉出用戶並將其傳遞給模板並不奇怪 - 這是處理程序中的4行代碼?真的沒有辦法「簡化」這一點。 – elithrar

回答

1

援引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)) 
} 

沒有經過測試,它應該工作。 最大的問題是大猩猩使用map[interface{}]interface{}作爲商店,但是pongo使用map[string]interface{},注意不要在非洲大猩猩中使用非字符串作爲關鍵字。

+0

嘗試過,但pongo2.Context不支持索引,它確實有一個更新方法,但需要另一個pongo2.Context,但我不知道我能用 – zola

+0

檢查更新。 –

+0

好,但因爲'context.GetAll()'返回'map [interface {}]接口{}',它需要類型斷言之前,密鑰可以轉換爲字符串,問題是,當我試圖斷言它, **接口轉換:接口是mux.contextKey,不是字符串** – zola

相關問題