2012-04-03 2 views
5

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

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

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

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

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

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

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

--- UPDATE ---

Я последовал пример ниже и ссылки, но все еще не пришедшие прямо.

Мне просто нужен простой тест, который читает ключ и значение и помещает его в файл 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" 

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

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

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

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

ответ

3

Snap.extension.sessionthis модуль? AFAIK пакет snap-auth устарел.

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

Отметьте example, как настроить приложение для использования сессионных и архивных привязок. Тогда вы будете иметь возможность хранить данные в сессии:

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 (определено here) использует getKey функция от clientsession package (см. here). Из документов: If the file does not exist or is corrupted a random key will be generated and stored in that file.

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

+0

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

+0

см. Обновленный ответ – Yuras

+0

Nice. Теперь все работает. Все, что мне было нужно, это добавить commitSession, как вы предложили. Спасибо. Большая помощь. –

 Смежные вопросы

  • Нет связанных вопросов^_^