marg-do's

関数型生活

HaskellのWebフレームワークSnapで簡単セッション管理

HaskellのWebフレームワークといえばYesodですが、今回は勉強目的も兼ねてよりライトなフレームワークSnapを試してみます。 commitSessionを忘れていて結構手間取ったのですが、一度覚えてしまえばシンプルに使えていいと思いました。

開発環境

  • OS X 10.9.3
  • ghc 7.6.3
  • cabal 1.20.0.2
  • snap 0.13.2.6

Snapのインストール

今回は省略

実際のコード

起動して、http://localhost/save_sessionで動作を確認できる。

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Conrtol.Lens.TH

import Snap
import Snap.Snaplet.Session
import Snap.Snaplet.Backends.CookieSession

import qualified Data.ByteString.Char8 as B8
import qualified Data.Text as T
import Data.Maybe

--------------------------------------------------

-- | Session拡張を導入
data App = App { _sess :: Snaplet SessionManager }
makeLeses ''App

--------------------------------------------------

main :: IO ()
main = serveSnaplet defaultConfig app

-- | ルーティングの指定
routes :: [(B8.ByteString, Handler App App ())]
routes = [ ("/save_session", save_sessionH)
              , ("/load_session", load_sessionH) ]

app :: SnapletInit App App
app = makeSnaplet "app" "session sample application" Nothing $ do
    s <- nestSnaplet "sess" sess $
            initCookieSessionManager "site_key.txt" "sess" (Just 3600)
    addRoutes routes
    return App s

--------------------------------------------------

save_sessionH :: Handler App App ()
save_sessionH = do
   let (key, value) = ("name", "marg_do") -- セッションに保存するkey, value
   with sess $ setInSession key value -- セッションを保存
   with sess $ commitSession -- セッションをクライアントのクッキーにコミットする
   writeBS "<a href=¥"/load_session¥">LOAD SESSION</a>"

load_sessionH :: Handler App App ()
load_sessionH = do
    value <- with sess $ getFromSession "name" -- クッキーから値を取り出す
    case value of
        Just x -> writeBS . B8.pack . T.unpack $ x -- 取得成功
       Nothing -> writeBS "ERROR" -- 取得失敗

参考文献