From 36dce1a73f35c3f94236a759fe322a9fef5ec945 Mon Sep 17 00:00:00 2001 From: SCys Date: Mon, 9 Nov 2015 00:24:18 +0800 Subject: [PATCH 1/4] + support custom render, pongo2 tested --- context.go | 5 +++++ gin.go | 19 ++++++++++++------- render/custom_render.go | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 render/custom_render.go diff --git a/context.go b/context.go index b784c14b..0ee1515c 100644 --- a/context.go +++ b/context.go @@ -341,6 +341,11 @@ func (c *Context) HTML(code int, name string, obj interface{}) { c.Render(code, instance) } +func (c *Context) CustomRender(code int, name string, obj interface{}) { + instance := c.engine.CustomRender.Instance(name, obj) + c.Render(code, instance) +} + // IndentedJSON serializes the given struct as pretty JSON (indented + endlines) into the response body. // It also sets the Content-Type as "application/json". // WARNING: we recommend to use this only for development propuses since printing pretty JSON is diff --git a/gin.go b/gin.go index 3834d67e..e5a6712e 100644 --- a/gin.go +++ b/gin.go @@ -44,13 +44,14 @@ type ( // Create an instance of Engine, by using New() or Default() Engine struct { RouterGroup - HTMLRender render.HTMLRender - allNoRoute HandlersChain - allNoMethod HandlersChain - noRoute HandlersChain - noMethod HandlersChain - pool sync.Pool - trees methodTrees + HTMLRender render.HTMLRender + CustomRender render.CustomRender + allNoRoute HandlersChain + allNoMethod HandlersChain + noRoute HandlersChain + noMethod HandlersChain + pool sync.Pool + trees methodTrees // Enables automatic redirection if the current route can't be matched but a // handler for the path with (without) the trailing slash exists. @@ -147,6 +148,10 @@ func (engine *Engine) SetHTMLTemplate(templ *template.Template) { engine.HTMLRender = render.HTMLProduction{Template: templ} } +func (engine *Engine) SetCustomRenderFunc(f render.CustomRenderFunc) { + engine.CustomRender = render.CustomRenderProduction{f} +} + // Adds handlers for NoRoute. It return a 404 code by default. func (engine *Engine) NoRoute(handlers ...HandlerFunc) { engine.noRoute = handlers diff --git a/render/custom_render.go b/render/custom_render.go new file mode 100644 index 00000000..cce11905 --- /dev/null +++ b/render/custom_render.go @@ -0,0 +1,39 @@ +// Copyright 2014 Manu Martinez-Almeida. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package render + +import ( + "net/http" +) + +type ( + CustomRenderFunc func(http.ResponseWriter, string, interface{}) error + + CustomRender interface { + Instance(string, interface{}) Render + } + + CustomRenderProduction struct { + RenderFunc CustomRenderFunc + } + + Custom struct { + RenderFunc CustomRenderFunc + Name string + Data interface{} + } +) + +func (r CustomRenderProduction) Instance(name string, data interface{}) Render { + return Custom{ + RenderFunc: r.RenderFunc, + Name: name, + Data: data, + } +} + +func (r Custom) Render(w http.ResponseWriter) error { + return r.RenderFunc(w, r.Name, r.Data) +} From 4c20e9de09ef71079eb1a45b31f6aec0cb2b9192 Mon Sep 17 00:00:00 2001 From: SCys Date: Mon, 9 Nov 2015 00:41:31 +0800 Subject: [PATCH 2/4] + add custom render test(TODO) + add custom render in readme.md --- README.md | 80 +++++++++++++++++++++++++++++++++++++++++++ render/render_test.go | 4 +++ 2 files changed, 84 insertions(+) diff --git a/README.md b/README.md index e83952d6..3b9101da 100644 --- a/README.md +++ b/README.md @@ -459,6 +459,86 @@ func main() { ``` +#### Custom rendering + +Custom your template engine use SetCustomRenderFunc() + +```go +package main + +import ( + "github.com/flosch/pongo2" + "github.com/gin-gonic/gin" + "net/http" + "errors" +) + +func CustomRenderFunc(w http.ResponseWriter, name string, obj interface{}) error { + var err error + tpl, err := pongo2.FromFile(name) + if err != nil { + return err + } + + if obj == nil { + err = tpl.ExecuteWriter(nil, w) + } else { + + if data,ok := obj.(gin.H); ok { + err = tpl.ExecuteWriter(pongo2.Context(data), w) + } else if data,ok := obj.(pongo2.Context); ok { + err = tpl.ExecuteWriter(data, w) + } else { + return errors.New("invalid obj type") + } + } + + return err +} + +func main() { + router := gin.Default() + + pongo2.DefaultLoader.SetBaseDir("templates") + router.SetCustomRenderFunc(CustomRenderFunc) + + router.GET("/", func(c *gin.Context) { + c.CustomRender(200, "index.html", nil) + }) + + router.GET("/msg1", func(c *gin.Context) { + c.CustomRender(200, "message.html", pongo2.Context{ + "message": c.Query("name"), + }) + }) + + router.GET("/msg2", func(c *gin.Context) { + c.CustomRender(200, "message.html", gin.H{ + "message": c.Query("name"), + }) + }) + + router.Run("[::]:8888") +} +``` + +templates/index.html +```html +

+ hi +

+ +``` + +templates/message.html +```html +

+ hi {{ message }} +

+ +``` + + #### Redirects Issuing a HTTP redirect is easy: diff --git a/render/render_test.go b/render/render_test.go index 7a6ffb7d..519895b9 100644 --- a/render/render_test.go +++ b/render/render_test.go @@ -128,3 +128,7 @@ func TestRenderHTMLTemplate(t *testing.T) { assert.Equal(t, w.Body.String(), "Hello alexandernyquist") assert.Equal(t, w.Header().Get("Content-Type"), "text/html; charset=utf-8") } + +func TestRenderCustom(t *testing.T) { + // TODO +} \ No newline at end of file From ad9a62d65f1bacb8cbdc19de323136b0ea3594c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E7=A0=94=E6=B7=B1?= Date: Sat, 28 Nov 2015 13:11:08 +0800 Subject: [PATCH 3/4] fix import --- gin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gin.go b/gin.go index e5a6712e..8e3006f3 100644 --- a/gin.go +++ b/gin.go @@ -11,7 +11,7 @@ import ( "os" "sync" - "github.com/gin-gonic/gin/render" + "github.com/SCys/gin/render" ) // Framework's version From 1e7cf4890c3b6389a1d7e570a998d84bab66ed81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E7=A0=94=E6=B7=B1?= Date: Sat, 28 Nov 2015 13:08:17 +0800 Subject: [PATCH 4/4] fix import --- gin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gin.go b/gin.go index e5a6712e..b79d1b34 100644 --- a/gin.go +++ b/gin.go @@ -11,7 +11,7 @@ import ( "os" "sync" - "github.com/gin-gonic/gin/render" + "./render" ) // Framework's version