Haskell Snap: пример сеанса - PullRequest
       15

Haskell Snap: пример сеанса

5 голосов
/ 03 апреля 2012

Я искал пример использования сеанса Snap. Пока ничего. Кто-нибудь может, пожалуйста, указать мне статью или что-то с простым примером сеанса на основе файлов cookie?

Фрагмент кода будет очень ценным. Что-то вроде ввода имени пользователя в сеанс и проверки его существования и действительности перед каждым запросом. Я посмотрел на Snap.extension.session, но я все еще слишком нуб, чтобы понять, как его использовать, просто из кода библиотеки.

Я понимаю, что setInSession - это функция для помещения значения сеанса в cookie, но я не могу понять, как использовать его из сигнатуры:

setInSession k v = Map.insert k v `liftM` getSession >>= setSession

или как склеить все это вместе.

Я не знаю, если это противоречит правилам - попросить немного примера кода, но я бы не стал этого делать, если бы мог найти что-нибудь в сети.

Заранее спасибо.

--- ОБНОВЛЕНИЕ ---

Я следовал приведенному ниже примеру и ссылкам, но все по-прежнему не получается.

Мне просто нужен простой тест, который считывает ключ и значение и помещает их в файл cookie сеанса, затем я хочу прочитать значение сеанса обратно и отобразить.

Итак, я инициализировал сеанс и перевел его в основное состояние приложения.

s <- nestSnaplet "" sess $ initCookieSessionManager "config/site_key.txt" "sess" (Just 3600)

Первая путаница - это ключ, который нужен для инициализации сеанса. Ключ не создается при первоначальной настройке проекта.

Так как мне его создать? Где должен находиться ключ в структуре файла проекта, чтобы функция могла его найти?

Тогда обработчики:

putCookie :: Handler App App ()
putCookie = do
  par <- getPostParams
  let k = T.decodeUtf8 $ head (par ! (B.pack "key"))
  let v = T.decodeUtf8 $ head (par ! (B.pack "value"))
  with sess $ setInSession k v
  heistLocal (bindString "message" "Cookie inserted!") $ render "reply"

Этот код просто читает ключ и значение из веб-формы, и предполагается, что пара «ключ-значение» помещается в файл cookie. Ну, видимо, это не так.

shCookie :: Handler App App ()
shCookie = do
  v <- with sess $ getFromSession "key"
  heistLocal (bindString "message" (fromMaybe "" v)) $ render "reply"

Этот просто читает его и отображает. Я всегда получаю пустую строку, что означает, что такой вещи нет.

Что-нибудь из вышеперечисленного выглядит неправильно? Где я могу ошибиться? Все компилируется правильно, но сессионный cookie просто отсутствует.

1 Ответ

3 голосов
/ 03 апреля 2012

Значит ли Snap.extension.session этот модуль?AFAIK пакет snap-auth устарел.

Вы можете использовать новый API сеанса , реализованный как snaplet .

Посмотрите пример как настроить приложение для использования сессий и аутентификации.Тогда вы сможете хранить данные в сеансе:

data App = App
{ _heist :: Snaplet (Heist App)
, _sess :: Snaplet SessionManager
, _auth :: Snaplet (AuthManager App)
}
makeLens ''App

myHandler :: Handler App App ()
myHandler = do
  with sess $ setInSession "key" "value"

ДОБАВЛЕНО:

Файл с ключом сайта будет создан автоматически.Функция initCookieSessionManager (определено здесь ) использует функцию getKey из пакета clientsession (см. здесь ).Из документов: If the file does not exist or is corrupted a random key will be generated and stored in that file.

Я думаю, что ваш обработчик не работает, потому что вы не зафиксировали сессию (см. commitSession здесь ). Вы можете зафиксировать это в каждом обновляющем обработчикесеанс или используйте wrapHandlers и / или withSession, чтобы сделать это автоматически.

...