2

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によると、セッションは型アサーションやコンテキストの受け渡しを必要とせずに暗黙的に渡されるようです (テンプレートはセッション値、つまり{{.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>

テンプレートデータを設定する必要があると確信しています。上記のドキュメントがそうしなかった理由がわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1