2

我正在尝试将 Happstack 教程中的 GET 和 POST 放入一个处理程序函数中,以便它始终在一起,我已经实现了这一点,但它看起来很难看。

login :: ServerPart Response
login = msum [ 
    do methodM POST
       user <- look "user"
       pass <- look "pass"
       success <- query $ CheckPassword user pass
       ok $ toResponse (user ++ ", " ++ pass ++ ": " ++ (if success then "Valid" else "Invalid")),
    ok $ toResponse $ html $ do
      B.head $ do
        title "Login Form"
      B.body $ do
        form ! enctype "multipart/form-data" ! B.method "POST" $ do
             B.label "user: " >> input ! type_ "text" ! name "user" ! size "10"
             B.label "pass: " >> input ! type_ "text" ! name "pass" ! size "10"
             input ! type_ "submit" ! name "upload"]

我想改变的事情是:

  1. 明确地呼吁methodM GET而不是让它成为失败者。

  2. 拉出多余ok $ toResponse的,只在一个地方。

  3. 最好也让 POST 返回 HTML。

  4. 对于有更多经验的人来说,其他任何看起来“不正常”的东西。有任何想法吗?

更新:找出#1;添加do methodM GET上面的ok $ toResponse $ ...作品很好,但像我这样的新手需要注意的是必须垂直排列,即 m inmethodM需要直接在 o in 上方ok。希望这可以节省几个小时的挫败感。

更新 2:#3 相当简单——只需将 POST 的最后一行更新为ok $ toResponse $ html $ do B.body $ toHtml $ user ++ ...

4

1 回答 1

2

查找 formlets(它们与 Happstack 一起使用)和/或消化函子(与 Snap 甚至可能与 Happstack 一起使用):

http://hackage.haskell.org/package/formlets

http://hackage.haskell.org/package/digestive-functors

我还没有研究过消化功能如何比formlets更好,但它是更新的包,可能比旧的更简单。

有一些例子

F# 中甚至还有一个库可以编译为 JavaScript 并在客户端执行类似的操作。它允许检查诸如从 JS 登录可用性之类的事情,同时仍然以漂亮的 formlet/function 样式编写。它被称为 WebSharper: WebSharper

于 2011-08-22T21:11:51.367 回答