Haskell快照:会话示例

Haskell快照:会话示例,haskell,haskell-snap-framework,Haskell,Haskell Snap Framework,我一直在谷歌上搜索如何使用快照会话的示例。目前还没有。 someon能给我指一篇文章或一些关于基于cookie会话的简单例子吗 一段代码片段将非常有用。 类似于在会话中放置用户名,并在每次请求之前检查其存在性和有效性。我查看了Snap.extension.session,但我仍然不知道如何从库代码中使用它 我知道setInSession是将会话值放入cookie的函数,但我无法从签名中完全理解如何使用它: setInSession k v = Map.insert k v `liftM` get

我一直在谷歌上搜索如何使用快照会话的示例。目前还没有。 someon能给我指一篇文章或一些关于基于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)

sSnap.extension.session
是否表示模块?AFAIK已弃用
snap auth

您可以使用新的实现为

查看如何设置应用程序以使用会话和身份验证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
(已定义)使用
clientsession
包中的
getKey
函数(请参阅)。从文档中:
如果文件不存在或已损坏,将生成一个随机密钥并存储在该文件中。


我认为您的处理程序不起作用,因为您没有提交会话(请参阅
commitSession
),您可以在每个更新会话的处理程序中提交它,或者使用
wrapHandlers
和/或
with session
自动执行该操作。

谢谢您的示例。我关注了你的链接,但由于某些原因,事情仍然不起作用。我将更新我原来的问题,增加一些困惑点。很好。现在一切都好了。我所需要的只是按照你的建议增加佣金。非常感谢。帮助很大。示例链接已断开。仅仅是我还是几乎不可能找到快照身份验证的示例代码?@phatmann您是否尝试通过
Snap init
生成简单的项目?它包含一个注册、登录和logout@Yuras,只是看了一下snap init代码,这正是我想要的。非常感谢!这确实解释了为什么没有人发布一个示例项目:-)我现在就要开始并将我的happstack lite项目切换到snap!
shCookie :: Handler App App ()
shCookie = do
  v <- with sess $ getFromSession "key"
  heistLocal (bindString "message" (fromMaybe "" v)) $ render "reply"
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"