gpt4 book ai didi

haskell - Snap 0.9 路由行为

转载 作者:行者123 更新时间:2023-12-02 21:18:13 25 4
gpt4 key购买 nike

我无法弄清楚 Snap 0.9(以及很可能的其他版本)中的路由奇怪之处

我知道“/”是一种捕获一切模式,除非我将 ifTop 函数放在处理程序中,对吧?因此,使用 ("/", blah) 路由,任何 URL 都应该由 blah 处理程序处理,对吗?

使用 snap init 生成的默认应用程序,我无法让 snap 为根请求渲染除 index.tpl 之外的任何内容。

给定根(“/”,等等)和处理程序

blah :: Handler App App ()
blah = render "blah"

它为除根 URL 之外的任何 URL 呈现 blah 模板!因此“/anything”呈现 blah 模板,但“/”呈现索引模板。

将 blah 处理程序更改为

blah = ifTop $ render "blah"

不会改变任何行为。仅在这种情况下,我无法路由到“/anything”。路由到“/”仍然呈现索引模板。我缺少什么?如何让“/”渲染我选择的模板?

最佳答案

如果您有“index.tpl”模板,那么无论如何它将用于渲染根页面。问题是 heistInit 函数:

heistInit :: FilePath                 -- ^ Path to templates
-> SnapletInit b (Heist b)
heistInit templateDir = do
makeSnaplet "heist" "" Nothing $ do
hs <- heistInitWorker templateDir defaultHeistState
addRoutes [ ("", heistServe) ]
return hs

您会看到它调用了addRoutes。因此,如果您在添加自己的路由之前调用 heistInit (默认模板),那么如果存在同名模板,您的处理程序将没有机会(或 root 的 index.tpl)。

因此,只需将 addRoutes 路由 放在 heistInit 上方(默认模板中 Site.hs 中的 app)即可。

关于haskell - Snap 0.9 路由行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11114781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com