HaskellのWebフレームワークSnapで簡単セッション管理
HaskellのWebフレームワークといえばYesodですが、今回は勉強目的も兼ねてよりライトなフレームワークSnapを試してみます。 commitSessionを忘れていて結構手間取ったのですが、一度覚えてしまえばシンプルに使えていいと思いました。
開発環境
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" -- 取得失敗