【问题标题】:Haskell Snap: Session exampleHaskell Snap:会话示例
【发布时间】:2012-04-16 20:36:49
【问题描述】:

我一直在谷歌上搜索有关如何使用 Snap 会话的示例。到目前为止什么都没有。 有人可以指点我一篇文章或带有基于 cookie 会话的简单示例的内容吗?

代码 sn-p 将非常受欢迎。 类似于将用户名放入会话中并在每次请求之前检查其存在和有效性。我查看了 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"

这只是从 web 表单中读取键和值,它应该将键值对放在 cookie 中。好吧,显然它没有。

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

这个只是读回来并显示。我总是得到一个空字符串,这意味着没有这样的东西。

以上任何内容看起来都不正确吗?我在哪里犯错? 一切编译正确,但会话 cookie 不存在。

【问题讨论】:

    标签: haskell haskell-snap-framework


    【解决方案1】:

    Snap.extension.session 是指this 模块吗? AFAIK snap-auth 包已弃用。

    您可以使用实现为snaplet 的新session api

    查看example 如何设置您的应用程序以使用会话和身份验证 snaplets。然后您将能够在会话中存储数据:

    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)使用来自clientsession 包的getKey 函数(参见here)。来自文档:If the file does not exist or is corrupted a random key will be generated and stored in that file.

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

    【讨论】:

    • 感谢您的示例。我关注了您的链接,但由于某种原因,事情仍然无法正常工作。我将用更多的混淆点来更新我的原始问题。
    • 不错的一个。现在一切正常。我所需要的只是按照您的建议添加 commitSession 。谢谢你。很好的帮助。
    • 示例链接已损坏。是我自己还是几乎不可能找到用于 Snap 身份验证的示例代码?
    • @phatmann 您是否尝试通过snap init 生成简单项目?它包含一个注册、登录和注销的示例
    • @Yuras,刚刚查看了 snap init 代码,这正是我想要的。非常感谢!它确实解释了为什么没有人发布示例项目 :-) 我要潜入并立即将我的 happstack-lite 项目切换到 snap!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多