为了账号安全,请及时绑定邮箱和手机立即绑定

Beego Session 不会自动将数据传递给模板

Beego Session 不会自动将数据传递给模板

Go
手掌心 2021-11-29 15:34:59
在获取类型为map[string]interface{}with 的会话信息后this.GetSession("session_key"),我确实必须像这样显式设置上下文和类型断言会话,以便显式地将数据传递给模板。// Get the sessionprofile := this.GetSession("profile")// Have to add data to the template's contextthis.Data["nickname"] = profile.(map[string]interface{})["nickname"].(string)this.Data["picture"] = profile.(map[string]interface{})["picture"].(string)// Render templatethis.TplNames = "user.html"会话数据(类型map[string]interface{})如下所示:{"nickname": "joe", "picture": "urltotheimg"}但是,根据 Beego 的 session doc,看起来会话是隐式传递的,不需要任何类型断言或上下文传递(模板可以立即访问会话值,即{{.nickname}}和{{.picture}})这是在重定向到之前设置会话的控制器 /user// Inherit beego's base controllertype 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}只有这样我才能将模板映射到这样的数据:<img src="{{ .picture }}"><p>Hello, {{ .nickname }}</p>我很确定有必要设置模板数据。我只是不确定为什么上面的文档没有这样做。任何帮助,将不胜感激。
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

我刚刚尝试运行Beego 快速入门项目并成功运行。


确保你同时安装了beego和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}}

请务必阅读本文以了解模板渲染是如何完成的。我希望这就是您所要求的,如果不是,请编辑您的问题并添加更多有用的信息,我将编辑此答案。


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信