haskell - 在 Hamlet 模板中测试用户是否登录

标签 haskell yesod hamlet

我想测试用户是否通过身份验证并根据状态显示“登录”或“注销”链接。

目前为止

$maybe muid <- maybeAuthId
    <a href=@{AuthR LogoutR} >Logout
$nothing
    <a href=@{AuthR LoginR} >Login

但是我得到一个错误:

Couldn't match expected type `Maybe v0'
            with actual type `GHandler s0 m0 (Maybe (AuthId m0))'
In the first argument of `Text.Hamlet.maybeH', namely `maybeAuthId'

最佳答案

maybeAuthId 是执行数据库和 session 相关操作的单子(monad)操作。你不能在 Hamlet 模板的定义中有 monadic Action 。想象一下如果你这样写会发生什么(一个类似的 monadic Action ):

$maybe a <- liftIO (putStrLn "Hello World") >> return (Just "Hi")
    <p>Just #{a}
$nothing
    <p>Nothing

该 Action 应该多久执行一次;每次渲染模板?什么时候加载?如果它除了向终端打印“Hello World”之外还做了其他事情,它可能会变得非常困惑,即使那样它也不是很安全——你希望你的模板文件能够打印到终端、发射核武器或窃取你的信用卡信息?

这就是为什么在所有莎士比亚模板中只允许使用纯值。您需要这样做:

getMyHandlerR :: Handler RepHtml
getMyHandlerR = do
  muid <- maybeAuthId
  $(widgetFile "foo")

(foo.hamlet:)

$maybe uid <- muid
  <p>Foo
$nothing
  <p>Bar

可以看到,maybeAuthId函数会在模板外执行,结果在模板内匹配。这样,您可以确保在您可以确定的特定时间点检查您的 session /数据库,并且您的模板不会注入(inject)病毒,因为您的设计师没有得到足够的报酬并报复你。

顺便说一下,您可能希望使用 Bool 来指示用户是否已登录,并改为使用 $if 语句。为此,您可能希望使用 Data.Maybe 模块中的 isJust 函数。

关于haskell - 在 Hamlet 模板中测试用户是否登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711302/

相关文章:

Haskell:接受类型参数并根据该类型返回值的函数?

haskell - 如何在 Yesod 中使用 blaze 代码编写小部件?

haskell - Docker容器中的Yesod应用程序无法发出网络请求

haskell - 如何使用 Data.Binary 存储递归数据类型

haskell - 没有因使用 `X' 而产生的 (Show a) 实例

yesod - 部署 Yesod 的推荐方法是什么?

haskell - 小村庄模板中的 $forall 问题

haskell - Hamlet 模板的编译时与运行时成本

haskell - 如何向小村庄模板添加条件注释?

haskell - 输入某种类型的 "motherfunction"