猿问

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

在获取类型为map[string]interface{}with 的会话信息后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 的 session 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

}

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


<img src="{{ .picture }}">

<p>Hello, {{ .nickname }}</p>

我很确定有必要设置模板数据。我只是不确定为什么上面的文档没有这样做。


任何帮助,将不胜感激。


手掌心
浏览 134回答 1
1回答

浮云间

我刚刚尝试运行Beego 快速入门项目并成功运行。确保你同时安装了beego和bee。创建新项目后,请bee new projectname确保编辑projectname/conf/app.conf文件并添加sessionon = true:appname = quickstarthttpport = 8080runmode = devsessionon = true我创建了一个重定向控制器,如:type RedirectController struct {&nbsp; &nbsp; beego.Controller}func (c *RedirectController) Get() {&nbsp; &nbsp; profile := make(map[string]interface{})&nbsp; &nbsp; profile["nickname"] = "User's Nickname"&nbsp; &nbsp; profile["picture"] = "/path/to/img.jpg"&nbsp; &nbsp; c.SetSession("profile", profile)&nbsp; &nbsp; c.Redirect("/", 301)}主控制器:type MainController struct {&nbsp; &nbsp; beego.Controller}func (c *MainController) Get() {&nbsp; &nbsp; profile := c.GetSession("profile")&nbsp; &nbsp; c.Data["nickname"] = profile.(map[string]interface{})["nickname"]&nbsp; &nbsp; c.Data["picture"] = profile.(map[string]interface{})["picture"]&nbsp; &nbsp; c.TplNames = "index.tpl"}我的 index.tpl 文件:<p>Nickname: {{.nickname}}</p><p>Picture: {{.picture}}</p>和路由器:func init() {&nbsp; &nbsp; beego.Router("/", &controllers.MainController{})&nbsp; &nbsp; beego.Router("/redirect", &controllers.RedirectController{})}我还建议您使用结构来存储配置文件值,例如:// Define struct.type Profile struct{&nbsp; &nbsp; Nickname string&nbsp; &nbsp; Picture&nbsp; string}// Save it for template rendering.this.Data["profile"] = &Profile{Nickname:"astaxie", Picture:"img.jpg"}// And render it like this:Nickname: {{.profile.Nickname}}Picture:&nbsp; {{.profile.Picture}}请务必阅读本文以了解模板渲染是如何完成的。我希望这就是您所要求的,如果不是,请编辑您的问题并添加更多有用的信息,我将编辑此答案。
随时随地看视频慕课网APP

相关分类

Go
我要回答