Happstack和blaze的Haskell网络路由示例没有显示两个不同的URL



我已经完成了Happstack崩溃课程,并有工作改革和web路由的例子。我正试图像这样将两者结合起来,但showURLHome和showURLLogin为我的示例应用程序显示了相同的URL。

以下是的示例应用程序

, GeneralizedNewtypeDeriving
, TemplateHaskell
, TypeOperators
, GADTs
, OverloadedStrings
, TypeFamilies
#-}
module Main where
import Data.Data
import Control.Applicative
import Control.Monad
import Control.Monad.Trans.Class
import           Text.Blaze
import           Text.Blaze.Html
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
import Text.Reform
import Text.Reform.Happstack
import Text.Reform.Blaze.Text
import Happstack.Server
import Web.Routes 
import Web.Routes.TH
import Web.Routes.Happstack
import Web.Routes.Boomerang
import Text.Boomerang.TH
import Text.Boomerang.HStack
import Text.Boomerang.Texts ()
import Data.Text
data Sitemap
= Login
| Home
deriving (Eq, Ord, Read, Show, Data, Typeable)

-- $(derivePathInfo ''Sitemap)
$(makeBoomerangs ''Sitemap)
sitemap :: Router () (Sitemap :- ())
sitemap =  rLogin
<> rHome

site :: Site Sitemap (ServerPartT IO Response)
site =
setDefault Login $ boomerangSiteRouteT route sitemap

route :: Sitemap -> RouteT Sitemap (ServerPartT IO) Response
route Login = loginPage
route Home  = homePage
appTemplate :: String
->  [H.Html]
-> H.Html
-> H.Html
appTemplate title headers body =
H.html $ do
H.head $ do
H.title $ toHtml title
sequence_ headers
H.body $ do
body
data LoginData = LoginData 
{ username :: Text
, password :: Text
}

renderLoginData :: LoginData -> H.Html
renderLoginData loginData = H.dl $ do H.dt $ "name: "
H.dd $ (text . username) loginData
H.dt $ "password: "
H.dd $ (text . password) loginData
data AppError
= AppCFE (CommonFormError [Input])
deriving Show
instance FormError AppError where
type ErrorInputType AppError = [Input]
commonFormError = AppCFE
loginForm :: Form (ServerPartT IO) [Input] AppError Html () LoginData
loginForm = LoginData 
<$>  label (Data.Text.pack "username:") ++> inputText (Data.Text.pack "") <++ br
<*>  label (Data.Text.pack "password: ") ++> inputPassword <++ br
<*  inputSubmit "post"

homePage :: RouteT Sitemap (ServerPartT IO) Response
homePage =  ok $ toResponse $
H.html $ do
H.body $ do
H.p "You have logged in successfully"
loginPage :: RouteT Sitemap (ServerPartT IO) Response
loginPage = 
do homeURL <- showURL Home
loginURL <- showURL Login
-- formHTML <- lift $ reform (form homeURL) "loginPage" displayMessage Nothing loginForm 
ok $ toResponse $
H.html $ do
H.head $ do
H.title "Hello Form"
H.body $ do
-- formHTML
H.span $ toHtml homeURL
H.br
H.span $ toHtml loginURL 
where
displayMessage :: LoginData -> ServerPartT IO H.Html
displayMessage loginData = return $ appTemplate "Form validation result" [] $ renderLoginData loginData 

main :: IO ()
main = simpleHTTP nullConf $
msum [ implSite "http://localhost:8000" "" site

]

loginPage中的homeURL和loginURL相等,但它们应该有自己的路径。当我学习Happstack速成课程时,当我提到它时,Sitemap的Home和UserOverview构造函数会收到自己的URL,所以我不确定为什么我的示例脚本的Sitemap的构造函数Login和Home没有收到不同的URL。

我发现这是导入中的一个微妙问题。我需要包括这些进口/

导入前奏曲隐藏(head,id,(.((进口管制。类别(id,(.((

我需要确定Prelude的composition(.(运算符和Control.Category的composite(.(操作符之间的区别。

添加导入后,我可以将网站地图更改为

sitemap :: Router () (Sitemap :- ())
sitemap =  rLogin
<> lit (Data.Text.pack "home") .rHome

之前它在使用Prelude的composition操作符时抱怨。

最新更新