Beego Session 不自动向模板传递数据
Beego Session Not Passing Data to Template Automatically
在使用 this.GetSession("session_key")
获取 map[string]interface{}
类型的会话信息后,我确实必须显式设置上下文并像这样键入断言会话,以便将数据显式传递给模板。
// Get the session
profile := this.GetSession("profile")
// Have to add data to the template's context
this.Data["nickname"] = profile.(map[string]interface{})["nickname"].(string)
this.Data["picture"] = profile.(map[string]interface{})["picture"].(string)
// Render template
this.TplNames = "user.html"
会话数据(类型 map[string]interface{}
)如下所示:
{"nickname": "joe", "picture": "urltotheimg"}
然而,根据 Beego 的会话 doc,看起来会话是隐式传递的,不需要任何类型断言或上下文传递(模板可以立即访问会话值,即 {{.nickname}}
和 {{.picture}}
)
这是在重定向到 /user
之前设置会话的控制器
// Inherit beego's base controller
type MyController struct {
beego.Controller
}
func (this *MyController) Get() {
// code for getting token here
// Getting the User information
client := conf.Client(oauth2.NoContext, token)
resp, err := client.Get("https://" + domain + "/userinfo")
if err != nil {
this.Redirect("/error", 500)
return
}
// Reading the body for user's information
raw, err := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
this.Redirect("/error", 500)
return
}
// Unmarshalling the JSON of the Profile
var profile map[string]interface{}
if err := json.Unmarshal(raw, &profile); err != nil {
this.Redirect("/error", 500)
return
}
// Saving the information to the session.
this.SetSession("profile", profile)
// redirect to /user
this.Redirect("/user", 301)
}
这是“/user”的控制器
type UserController struct {
beego.Controller
}
func (this *UserController) Get() {
// get the saved session
profile := this.GetSession("profile")
// without setting the template data here, the session data won't be
// available in user.html
this.Data["nickname"] = profile.(map[string]interface{})["nickname"].(string)
this.Data["picture"] = profile.(map[string]interface{})["picture"].(string)
this.TplNames = "user.html"
}
只有这样我才能像这样将模板映射到数据:
<img src="{{ .picture }}">
<p>Hello, {{ .nickname }}</p>
我确定有必要设置模板数据。我只是不确定为什么上面的文档没有这样做。
如有任何帮助,我们将不胜感激。
我刚刚尝试 运行 Beego quickstart 项目并 运行 它成功了。
确保安装了 beego and bee。使用 bee new projectname
创建新项目后,确保编辑 projectname/conf/app.conf 文件并添加 sessionon = true :
appname = quickstart
httpport = 8080
runmode = dev
sessionon = true
我创建了一个重定向控制器,例如:
type RedirectController struct {
beego.Controller
}
func (c *RedirectController) Get() {
profile := make(map[string]interface{})
profile["nickname"] = "User's Nickname"
profile["picture"] = "/path/to/img.jpg"
c.SetSession("profile", profile)
c.Redirect("/", 301)
}
主控制器:
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
profile := c.GetSession("profile")
c.Data["nickname"] = profile.(map[string]interface{})["nickname"]
c.Data["picture"] = profile.(map[string]interface{})["picture"]
c.TplNames = "index.tpl"
}
我的 index.tpl 文件:
<p>Nickname: {{.nickname}}</p>
<p>Picture: {{.picture}}</p>
路由器:
func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/redirect", &controllers.RedirectController{})
}
我还建议您使用一种结构来存储配置文件值,例如:
// Define struct.
type Profile struct{
Nickname string
Picture string
}
// Save it for template rendering.
this.Data["profile"] = &Profile{Nickname:"astaxie", Picture:"img.jpg"}
// And render it like this:
Nickname: {{.profile.Nickname}}
Picture: {{.profile.Picture}}
请务必阅读 this 以了解模板渲染是如何完成的。我希望这是您要的,如果不是,请编辑您的问题并添加更多有用的信息,我将编辑此答案。
在使用 this.GetSession("session_key")
获取 map[string]interface{}
类型的会话信息后,我确实必须显式设置上下文并像这样键入断言会话,以便将数据显式传递给模板。
// Get the session
profile := this.GetSession("profile")
// Have to add data to the template's context
this.Data["nickname"] = profile.(map[string]interface{})["nickname"].(string)
this.Data["picture"] = profile.(map[string]interface{})["picture"].(string)
// Render template
this.TplNames = "user.html"
会话数据(类型 map[string]interface{}
)如下所示:
{"nickname": "joe", "picture": "urltotheimg"}
然而,根据 Beego 的会话 doc,看起来会话是隐式传递的,不需要任何类型断言或上下文传递(模板可以立即访问会话值,即 {{.nickname}}
和 {{.picture}}
)
这是在重定向到 /user
// Inherit beego's base controller
type MyController struct {
beego.Controller
}
func (this *MyController) Get() {
// code for getting token here
// Getting the User information
client := conf.Client(oauth2.NoContext, token)
resp, err := client.Get("https://" + domain + "/userinfo")
if err != nil {
this.Redirect("/error", 500)
return
}
// Reading the body for user's information
raw, err := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
this.Redirect("/error", 500)
return
}
// Unmarshalling the JSON of the Profile
var profile map[string]interface{}
if err := json.Unmarshal(raw, &profile); err != nil {
this.Redirect("/error", 500)
return
}
// Saving the information to the session.
this.SetSession("profile", profile)
// redirect to /user
this.Redirect("/user", 301)
}
这是“/user”的控制器
type UserController struct {
beego.Controller
}
func (this *UserController) Get() {
// get the saved session
profile := this.GetSession("profile")
// without setting the template data here, the session data won't be
// available in user.html
this.Data["nickname"] = profile.(map[string]interface{})["nickname"].(string)
this.Data["picture"] = profile.(map[string]interface{})["picture"].(string)
this.TplNames = "user.html"
}
只有这样我才能像这样将模板映射到数据:
<img src="{{ .picture }}">
<p>Hello, {{ .nickname }}</p>
我确定有必要设置模板数据。我只是不确定为什么上面的文档没有这样做。
如有任何帮助,我们将不胜感激。
我刚刚尝试 运行 Beego quickstart 项目并 运行 它成功了。
确保安装了 beego and bee。使用 bee new projectname
创建新项目后,确保编辑 projectname/conf/app.conf 文件并添加 sessionon = true :
appname = quickstart
httpport = 8080
runmode = dev
sessionon = true
我创建了一个重定向控制器,例如:
type RedirectController struct {
beego.Controller
}
func (c *RedirectController) Get() {
profile := make(map[string]interface{})
profile["nickname"] = "User's Nickname"
profile["picture"] = "/path/to/img.jpg"
c.SetSession("profile", profile)
c.Redirect("/", 301)
}
主控制器:
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
profile := c.GetSession("profile")
c.Data["nickname"] = profile.(map[string]interface{})["nickname"]
c.Data["picture"] = profile.(map[string]interface{})["picture"]
c.TplNames = "index.tpl"
}
我的 index.tpl 文件:
<p>Nickname: {{.nickname}}</p>
<p>Picture: {{.picture}}</p>
路由器:
func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/redirect", &controllers.RedirectController{})
}
我还建议您使用一种结构来存储配置文件值,例如:
// Define struct.
type Profile struct{
Nickname string
Picture string
}
// Save it for template rendering.
this.Data["profile"] = &Profile{Nickname:"astaxie", Picture:"img.jpg"}
// And render it like this:
Nickname: {{.profile.Nickname}}
Picture: {{.profile.Picture}}
请务必阅读 this 以了解模板渲染是如何完成的。我希望这是您要的,如果不是,请编辑您的问题并添加更多有用的信息,我将编辑此答案。