mirror of
https://github.com/astaxie/beego.git
synced 2024-11-22 14:50:55 +00:00
add template read lock when dev mode
This commit is contained in:
parent
4b99e41880
commit
1f46c1d231
@ -199,6 +199,7 @@ func (c *Controller) RenderString() (string, error) {
|
|||||||
func (c *Controller) RenderBytes() ([]byte, error) {
|
func (c *Controller) RenderBytes() ([]byte, error) {
|
||||||
//if the controller has set layout, then first get the tplname's content set the content to the layout
|
//if the controller has set layout, then first get the tplname's content set the content to the layout
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
var err error
|
||||||
if c.Layout != "" {
|
if c.Layout != "" {
|
||||||
if c.TplName == "" {
|
if c.TplName == "" {
|
||||||
c.TplName = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt
|
c.TplName = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt
|
||||||
@ -216,14 +217,15 @@ func (c *Controller) RenderBytes() ([]byte, error) {
|
|||||||
}
|
}
|
||||||
BuildTemplate(BConfig.WebConfig.ViewsPath, buildFiles...)
|
BuildTemplate(BConfig.WebConfig.ViewsPath, buildFiles...)
|
||||||
}
|
}
|
||||||
if _, ok := BeeTemplates[c.TplName]; !ok {
|
if t := getTemplateByName(c.TplName); t == nil {
|
||||||
panic("can't find templatefile in the path:" + c.TplName)
|
panic("can't find templatefile in the path:" + c.TplName)
|
||||||
}
|
} else {
|
||||||
err := BeeTemplates[c.TplName].ExecuteTemplate(&buf, c.TplName, c.Data)
|
err = t.ExecuteTemplate(&buf, c.TplName, c.Data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Trace("template Execute err:", err)
|
Trace("template Execute err:", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
c.Data["LayoutContent"] = template.HTML(buf.String())
|
c.Data["LayoutContent"] = template.HTML(buf.String())
|
||||||
|
|
||||||
if c.LayoutSections != nil {
|
if c.LayoutSections != nil {
|
||||||
@ -234,7 +236,7 @@ func (c *Controller) RenderBytes() ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
err = BeeTemplates[sectionTpl].ExecuteTemplate(&buf, sectionTpl, c.Data)
|
err = getTemplateByName(sectionTpl).ExecuteTemplate(&buf, sectionTpl, c.Data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Trace("template Execute err:", err)
|
Trace("template Execute err:", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -244,7 +246,7 @@ func (c *Controller) RenderBytes() ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
err = BeeTemplates[c.Layout].ExecuteTemplate(&buf, c.Layout, c.Data)
|
err = getTemplateByName(c.Layout).ExecuteTemplate(&buf, c.Layout, c.Data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Trace("template Execute err:", err)
|
Trace("template Execute err:", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -258,15 +260,16 @@ func (c *Controller) RenderBytes() ([]byte, error) {
|
|||||||
if BConfig.RunMode == DEV {
|
if BConfig.RunMode == DEV {
|
||||||
BuildTemplate(BConfig.WebConfig.ViewsPath, c.TplName)
|
BuildTemplate(BConfig.WebConfig.ViewsPath, c.TplName)
|
||||||
}
|
}
|
||||||
if _, ok := BeeTemplates[c.TplName]; !ok {
|
if t := getTemplateByName(c.TplName); t == nil {
|
||||||
panic("can't find templatefile in the path:" + c.TplName)
|
panic("can't find templatefile in the path:" + c.TplName)
|
||||||
}
|
} else {
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
err := BeeTemplates[c.TplName].ExecuteTemplate(&buf, c.TplName, c.Data)
|
err = t.ExecuteTemplate(&buf, c.TplName, c.Data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Trace("template Execute err:", err)
|
Trace("template Execute err:", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return buf.Bytes(), nil
|
return buf.Bytes(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
27
template.go
27
template.go
@ -30,13 +30,21 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
beegoTplFuncMap = make(template.FuncMap)
|
beegoTplFuncMap = make(template.FuncMap)
|
||||||
// BeeTemplates caching map and supported template file extensions.
|
// beeTemplates caching map and supported template file extensions.
|
||||||
BeeTemplates = make(map[string]*template.Template)
|
beeTemplates = make(map[string]*template.Template)
|
||||||
templatesLock sync.Mutex
|
templatesLock sync.RWMutex
|
||||||
// BeeTemplateExt stores the template extension which will build
|
// beeTemplateExt stores the template extension which will build
|
||||||
BeeTemplateExt = []string{"tpl", "html"}
|
beeTemplateExt = []string{"tpl", "html"}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func getTemplateByName(name string) *template.Template {
|
||||||
|
if BConfig.RunMode == "dev" {
|
||||||
|
templatesLock.RLock()
|
||||||
|
defer templatesLock.RUnlock()
|
||||||
|
}
|
||||||
|
return beeTemplates[name]
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
beegoTplFuncMap["dateformat"] = DateFormat
|
beegoTplFuncMap["dateformat"] = DateFormat
|
||||||
beegoTplFuncMap["date"] = Date
|
beegoTplFuncMap["date"] = Date
|
||||||
@ -55,7 +63,6 @@ func init() {
|
|||||||
beegoTplFuncMap["config"] = GetConfig
|
beegoTplFuncMap["config"] = GetConfig
|
||||||
beegoTplFuncMap["map_get"] = MapGet
|
beegoTplFuncMap["map_get"] = MapGet
|
||||||
|
|
||||||
// go1.2 added template funcs
|
|
||||||
// Comparisons
|
// Comparisons
|
||||||
beegoTplFuncMap["eq"] = eq // ==
|
beegoTplFuncMap["eq"] = eq // ==
|
||||||
beegoTplFuncMap["ge"] = ge // >=
|
beegoTplFuncMap["ge"] = ge // >=
|
||||||
@ -103,7 +110,7 @@ func (tf *templateFile) visit(paths string, f os.FileInfo, err error) error {
|
|||||||
|
|
||||||
// HasTemplateExt return this path contains supported template extension of beego or not.
|
// HasTemplateExt return this path contains supported template extension of beego or not.
|
||||||
func HasTemplateExt(paths string) bool {
|
func HasTemplateExt(paths string) bool {
|
||||||
for _, v := range BeeTemplateExt {
|
for _, v := range beeTemplateExt {
|
||||||
if strings.HasSuffix(paths, "."+v) {
|
if strings.HasSuffix(paths, "."+v) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -113,12 +120,12 @@ func HasTemplateExt(paths string) bool {
|
|||||||
|
|
||||||
// AddTemplateExt add new extension for template.
|
// AddTemplateExt add new extension for template.
|
||||||
func AddTemplateExt(ext string) {
|
func AddTemplateExt(ext string) {
|
||||||
for _, v := range BeeTemplateExt {
|
for _, v := range beeTemplateExt {
|
||||||
if v == ext {
|
if v == ext {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BeeTemplateExt = append(BeeTemplateExt, ext)
|
beeTemplateExt = append(beeTemplateExt, ext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// BuildTemplate will build all template files in a directory.
|
// BuildTemplate will build all template files in a directory.
|
||||||
@ -149,7 +156,7 @@ func BuildTemplate(dir string, files ...string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
Trace("parse template err:", file, err)
|
Trace("parse template err:", file, err)
|
||||||
} else {
|
} else {
|
||||||
BeeTemplates[file] = t
|
beeTemplates[file] = t
|
||||||
}
|
}
|
||||||
templatesLock.Unlock()
|
templatesLock.Unlock()
|
||||||
}
|
}
|
||||||
|
@ -70,10 +70,10 @@ func TestTemplate(t *testing.T) {
|
|||||||
if err := BuildTemplate(dir); err != nil {
|
if err := BuildTemplate(dir); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if len(BeeTemplates) != 3 {
|
if len(beeTemplates) != 3 {
|
||||||
t.Fatalf("should be 3 but got %v", len(BeeTemplates))
|
t.Fatalf("should be 3 but got %v", len(beeTemplates))
|
||||||
}
|
}
|
||||||
if err := BeeTemplates["index.tpl"].ExecuteTemplate(os.Stdout, "index.tpl", nil); err != nil {
|
if err := beeTemplates["index.tpl"].ExecuteTemplate(os.Stdout, "index.tpl", nil); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for _, name := range files {
|
for _, name := range files {
|
||||||
@ -126,7 +126,7 @@ func TestRelativeTemplate(t *testing.T) {
|
|||||||
if err := BuildTemplate(dir, files[1]); err != nil {
|
if err := BuildTemplate(dir, files[1]); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := BeeTemplates["easyui/rbac/user.tpl"].ExecuteTemplate(os.Stdout, "easyui/rbac/user.tpl", nil); err != nil {
|
if err := beeTemplates["easyui/rbac/user.tpl"].ExecuteTemplate(os.Stdout, "easyui/rbac/user.tpl", nil); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
for _, name := range files {
|
for _, name := range files {
|
||||||
|
Loading…
Reference in New Issue
Block a user