有没有一种方法可以重构一些Happstack表单代码



我正试图将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 $ ...之上很好,但对于像我这样的新手来说,需要注意的是必须垂直排列,即methodM中的m需要直接位于ok中的o之上。希望这能为某人省去几个小时的沮丧。

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

查找formlet(它们与Happstack一起工作(和/或消化函数(它们与Snap一起工作,甚至可能与Happstack一起工作(:

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

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

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

有一些例子

F#中甚至有一个库可以编译为JavaScript,并在客户端执行类似的操作。它允许检查JS的登录可用性,同时仍然以漂亮的formlets/functional风格编写。它被称为WebSharper:WebSharper

相关内容

  • 没有找到相关文章

最新更新