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

时间:2015-12-08 22:09:26

标签: session go beego

在获得map[string]interface{}类型的this.GetSession("session_key")类型的会话信息后,我必须显式设置上下文并键入这样的会话,以便将数据显式传递给模板。

// 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,看起来会隐式传递会话而不需要类型断言或上下文传递(模板可以立即访问会话值,即{{1 }和{{.nickname}}

这是控制器在重定向到{{.picture}}

之前设置会话
/user

这是" / 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)
}

只有这样我才能将模板映射到这样的数据:

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"
}

我非常确定设置模板数据是必要的。我不确定为什么上述文件没有这样做。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我刚试过运行Beego quickstart项目并成功运行它。

确保您同时安装了beegobee。使用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以了解模板渲染的完成方式。我希望这是你要求的,如果没有,请编辑你的问题并添加更多有用的信息,我将编辑这个答案。