beego解决上下文信息模板函数

本文对比了Beego框架中的Go模板与Java的Freemarker模板功能,指出Beego模板在处理上下文信息方面的局限性,并提出了通过修改源代码来自定义模板函数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    感觉可能是beego在golang本身的模板函数上没有做过多的封装,也可能是自己使用java的freemarker的自定义模板习惯了,导致在web的一些情况下使用非常不方便。
    以下情况我只是拿java的freemarker来举例,个人还是非常喜欢golang这个语言的。
    不可否认beego里自己封装的模板函数使用起来非常方便,但我认为这只是一些全局函数。如果自己想把上下文的信息传入到自定义的模板函数里就需要把上下文的信息也一并传入到模板的函数里。也可能是因为beego是把页面所有的信息全部使用beego.Controller.Data这个map[interface{}]interface{}而这个最后又被html.template里的Template结构的ExecuteTemplate或者Execute方法当做模板处理的数据给了html模板。换名话说beego里所有数据作用域都最后是request级别,没有session、application之分。如果beego里开启session的话也是基于cookie的,通过配置sessionon = true外加cookie的标识与后台var globalSessions *session.Manager进行沟通来实现session,但是session里的数据如果需要在页面使用需手动添加到beego.Controller.Data里才可以使用。
    这种情况就会出来非常尴尬的情况,如果在cms系统里想取得当前的上下文信息,只能使用传参的方法来让模板函数知道,这对于一个cms系统来说让前台写模板使用非常麻烦。不能像freemarker一样,定义一个模板可以得到request里存储的对象、session里存储的对象、application(实际中这个没什么太大用处)。
设想一下以下几种情况:
1、实现一个模板函数用于列出栏目下的文章,如果是OWN则列出自己栏目下的文章、PARENT则列出父级栏目下的文章、栏目id则列出相应栏目下的文章;
2、实现一个模板函数且于指向文章的上一篇文与下一篇文章,一篇文章可能在多个栏目里,在每个栏目里的上一篇与下一篇文章不一定是一样的;
    这种模板函数需要根据上下文信息来处理的情况在beego的模板函数处理起来就需要把所需的数据都传到模板函数里,最好使用的是一个map来存数据,但这样实现起来也没有像freemarker那样清晰。
    其他golang的web框架不知道有没有这种情况,要解决这个问题就必须要修改一下beego的源代码了。我是这样解决的,声明一个结构体,里面的所有公共方法方法都是模板函数,用一个属性存储beego.Controller.Data信息,一个属性存储模板函数名与里面的公共方法。在beego.template.go的ExecuteViewPathTemplate方法里在使用ExecuteTemplate与Execute方法之前声明一个结构体,然后把beego.Controller.Data信息赋值过去,然后把beego自己的模板函数与这个对象的函数重新组合成一个html.template.FuncMap赋值给html.template.Template.Funcs。

原文地址:http://www.1025m.com/36.html

转载于:https://my.oschina.net/wolf2leader/blog/1648387

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值