有没有办法重构一些这种Happstack表单代码?

时间:2011-08-22 15:08:03

标签: haskell happstack

我正在尝试将Happstack教程中的GE​​T和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. 对任何有经验的人说“关闭”的任何其他内容。有什么想法吗?

  5. 更新:想出#1;在do methodM GET之上添加ok $ toResponse $ ...可以正常工作,但像我这样的新手要注意的是必须垂直排列,即methodM中的m需要在ok的o正上方。希望这可以节省数小时的挫折感。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

我没有研究过消化函数如何比小模型更好,但它是更新的软件包,可能比旧软件包更简单。

有一些examples

F#中甚至还有一个库可编译为JavaScript,并在客户端执行类似的操作。它允许检查来自JS的登录可用性之类的东西,同时仍然以漂亮的formlet /功能样式编写。它叫做WebSharper: WebSharper