Yesodでセッションを使用する
プログラム例
-- -*- coding: utf-8 -*-
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
import Yesod
import Control.Applicative ((<$>), (<*>))
data App = App
mkYesod "App" [parseRoutes|
/ RootR GET POST
|]
instance Yesod App
instance RenderMessage App FormMessage where
renderMessage _ _ = defaultFormMessage
getRootR :: Handler Html
getRootR = do
s <- getSession
defaultLayout [whamlet|
<form method=post>
<input type=text name=key>
<input type=text name=val>
<input type=submit>
<h1> 現在のセッション変数の内容
<p> #{show s}
|]
postRootR :: Handler ()
postRootR = do
(key, mval) <- runInputPost $ (,) <$> ireq textField "key" <*> iopt textField "val"
case mval of
Nothing -> deleteSession key
Just val -> setSession key val
redirect RootR
main = warp 3000 App
説明
yesodのセッションはハッシュマップのような識別子と値の集合であり、以下の関数で操作することができる。
- getSession: セッション変数全体を取得する
- setSession: 識別子と値のペアをセッション変数に登録する
- lookupSession: 識別子から値を検索する
- deleteSession: 指定した識別子をセッション変数から削除する
yesodではセッション変数自体が暗号化されてCookieとしてクライアントに送信されるので、 ウェブサーバが複数台存在する場合でも、セッションの内容をデータベース等に保存しておく必要がない。
ただし、セッション変数のデータ量が多くなると、その分だけCookieのデータ量も多くなる。