mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-15 21:06:39 +08:00
Merge af3876c120018648141b2816dcedead2d8369b3a into 61fae4997db3dc0011e9015f4f69f57c81e9ce4a
This commit is contained in:
commit
a83d44fbfc
80
README.md
80
README.md
@ -503,6 +503,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
|
||||
<html><h1>
|
||||
hi
|
||||
</h1>
|
||||
</html>
|
||||
```
|
||||
|
||||
templates/message.html
|
||||
```html
|
||||
<html><h1>
|
||||
hi {{ message }}
|
||||
</h1>
|
||||
</html>
|
||||
```
|
||||
|
||||
|
||||
#### Redirects
|
||||
|
||||
Issuing a HTTP redirect is easy:
|
||||
|
@ -383,6 +383,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
|
||||
|
7
gin.go
7
gin.go
@ -11,7 +11,7 @@ import (
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"github.com/gin-gonic/gin/render"
|
||||
"github.com/SCys/gin/render"
|
||||
)
|
||||
|
||||
// Framework's version
|
||||
@ -45,6 +45,7 @@ type (
|
||||
Engine struct {
|
||||
RouterGroup
|
||||
HTMLRender render.HTMLRender
|
||||
CustomRender render.CustomRender
|
||||
allNoRoute HandlersChain
|
||||
allNoMethod HandlersChain
|
||||
noRoute HandlersChain
|
||||
@ -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
|
||||
|
39
render/custom_render.go
Normal file
39
render/custom_render.go
Normal file
@ -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)
|
||||
}
|
@ -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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user