ホーム > Haskell > Yesodで動的サイトを作成する >

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のセッションはハッシュマップのような識別子と値の集合であり、以下の関数で操作することができる。

yesodではセッション変数自体が暗号化されてCookieとしてクライアントに送信されるので、 ウェブサーバが複数台存在する場合でも、セッションの内容をデータベース等に保存しておく必要がない。

ただし、セッション変数のデータ量が多くなると、その分だけCookieのデータ量も多くなる。