example_pongo2.go 962 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package main
  2. import (
  3. "net/http"
  4. "github.com/flosch/pongo2"
  5. "github.com/gin-gonic/gin"
  6. "github.com/gin-gonic/gin/render"
  7. )
  8. func main() {
  9. router := gin.Default()
  10. router.HTMLRender = newPongoRender()
  11. router.GET("/index", func(c *gin.Context) {
  12. c.HTML(200, "index.html", gin.H{
  13. "title": "Gin meets pongo2 !",
  14. "name": c.Input.Get("name"),
  15. })
  16. })
  17. router.Run(":8080")
  18. }
  19. type pongoRender struct {
  20. cache map[string]*pongo2.Template
  21. }
  22. func newPongoRender() *pongoRender {
  23. return &pongoRender{map[string]*pongo2.Template{}}
  24. }
  25. func (p *pongoRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  26. file := data[0].(string)
  27. ctx := data[1].(pongo2.Context)
  28. var t *pongo2.Template
  29. if tmpl, ok := p.cache[file]; ok {
  30. t = tmpl
  31. } else {
  32. tmpl, err := pongo2.FromFile(file)
  33. if err != nil {
  34. return err
  35. }
  36. p.cache[file] = tmpl
  37. t = tmpl
  38. }
  39. render.WriteHeader(w, code, "text/html")
  40. return t.ExecuteWriter(ctx, w)
  41. }