Golang Cafe #39 まとめ Gorilla web toolkit を試す。 その2

2014/07/20に開催された「Golang Cafe #39」についてのまとめです。

開催からかなり経ってしまいましたが、記録としてまとめておきます。


前回に引き続き今回もGorilla is a web toolkitを試してみる会となりました。
その中から、今回はgorilla/contextとgorilla/sessionsをみてみました。

gorilla/context

本家の説明はこちらのページ
何ができるのかというと、リクエストスコープで値を保存しておいたり、取得したりできるものという感じでしょうか。
インストールは

$ go get github.com/gorilla/context

でOKですが、前回muxを試したときに一緒にインストールされたかと思います。


前回gorilla/muxを試してみましたが、
ハンドラ内で解析されたURLのパラメータを取得する際に、

vars := mux.Vars(request)

としたと思いますが、ソースコードを確認すると、内部で、

context.Get(request, キー)

のようなことをしています。
おそらくURLを解析した際にパラメータ(名前/値)をコンテキスト(グローバル変数)に入れておき、ハンドラ内から取得するのに使用しているのだと思います。
リクエストスコープで値を保存しておく場所というような感じで良いと思います。(有効時間は設定できそうです)

gorilla/sessions

本家の説明はこちらのページ
本家の説明を参照すると「クッキーやファイルシステムを使用したセッションや、カスタムセッションのインフラを提供してくれる」らしい。
いわゆるセッションです。
リクエストを跨いで値を保持することができます。その保存先がクッキーやらファイルシステムやらということだと思います。
インストールは他と同じです。

$ go get github.com/gorilla/sessions

本家と同じようなサンプルになりますが載せておきます。

const SESSION_NAME = "session-name"

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/set", MyHandler)
    r.HandleFunc("/get", MyHandler2)

    http.Handle("/", r)

    http.ListenAndServe(":8080", nil)
}

var store = sessions.NewCookieStore([]byte("something-very-secret"))

func MyHandler(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, SESSION_NAME)
    session.Values["foo"] = "bar"
    session.Values[42] = 43

    session.Save(r, w)

    w.Write([]byte("MyHandler"))
}

func MyHandler2(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, SESSION_NAME)

    fmt.Println(session.Values["foo"])
    fmt.Println(session.Values[42])

    w.Write([]byte("MyHandler2"))
}

sessions.NewCookieStore でクッキーを使用するセッションストアを定義しておき、store.Getで取り出します。既存のセッションがない場合は作成されます。session.Saveで保存します。
セッションをクリアするには、context.Clear(request)を呼ぶようです。(すいません、未確認です)

基本的なセッションの機能は提供されているので、あとは各々実装すれば良いと思われます。