example_pongo2.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package main
  2. import (
  3. "github.com/flosch/pongo2"
  4. "github.com/gin-gonic/gin"
  5. "net/http"
  6. )
  7. type pongoRender struct {
  8. cache map[string]*pongo2.Template
  9. }
  10. func newPongoRender() *pongoRender {
  11. return &pongoRender{map[string]*pongo2.Template{}}
  12. }
  13. func writeHeader(w http.ResponseWriter, code int, contentType string) {
  14. if code >= 0 {
  15. w.Header().Set("Content-Type", contentType)
  16. w.WriteHeader(code)
  17. }
  18. }
  19. func (p *pongoRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
  20. file := data[0].(string)
  21. ctx := data[1].(pongo2.Context)
  22. var t *pongo2.Template
  23. if tmpl, ok := p.cache[file]; ok {
  24. t = tmpl
  25. } else {
  26. tmpl, err := pongo2.FromFile(file)
  27. if err != nil {
  28. return err
  29. }
  30. p.cache[file] = tmpl
  31. t = tmpl
  32. }
  33. writeHeader(w, code, "text/html")
  34. return t.ExecuteWriter(ctx, w)
  35. }
  36. func main() {
  37. r := gin.Default()
  38. r.HTMLRender = newPongoRender()
  39. r.GET("/index", func(c *gin.Context) {
  40. name := c.Request.FormValue("name")
  41. ctx := pongo2.Context{
  42. "title": "Gin meets pongo2 !",
  43. "name": name,
  44. }
  45. c.HTML(200, "index.html", ctx)
  46. })
  47. // Listen and server on 0.0.0.0:8080
  48. r.Run(":8080")
  49. }