gpt4 book ai didi

haskell - 如何使用 Spock 和 Lucid 提供静态文件?

转载 作者:行者123 更新时间:2023-12-02 00:05:39 26 4
gpt4 key购买 nike

开始使用 Haskell、Spock 和 Lucid 进行 Web 开发,我不知道如何提供静态文件。在 Main.hs 目录中,我有 /static/css/main.css,其中仅包含背景颜色,以查看 css 是否确实应用。所以我的目录树看起来像

app
├── Main.hs
└── static
   └── css
      └── main.css

但是,使用以下配置,找不到 main.css 文件(使用 Firefox 检查时包含 404)。除此之外,该网站显示良好。

我尝试模仿 funblog例如,当涉及到服务这些文件时(使用 Wai),更改为 Lucid 而不是 Blaze。特别是 Web/Blog.hs 中的中间件 $staticPolicy (addBase "static")以及我们从 Web/Views/Site.hs 链接 css 的行.

module Main where    

import Network.Wai.Middleware.Static
import Lucid
import Web.Spock
import Web.Spock.Config
import Web.Spock.Lucid (lucid)

type Server a = SpockM () () () a

main :: IO ()
main = do
cfg <- defaultSpockCfg () PCNoDatabase ()
runSpock 8080 (spock cfg app)

app :: Server ()
app = do
middleware $ staticPolicy (addBase "static")
get root $ do
lucid $ do
head_ $ link_ [ rel_ "stylesheet"
, type_ "text/css"
, href_ "/css/main.css"
]
body_ $ h1_ "Hello."

<小时/> 编辑/添加 将 Lucid 翻译为 Blaze 会得到相同的结果(翻译如下),所以我一定在其他地方遗漏了一些东西。

-- Additional imports
import Text.Blaze.XHtml5 ((!))
import qualified Text.Blaze.XHtml5 as H
import qualified Text.Blaze.XHtml5.Attributes as A
import Control.Monad.Trans (MonadIO)
import Text.Blaze.Html.Renderer.Utf8 (renderHtml)

-- The main function did not change.

blaze :: MonadIO m => H.Html -> ActionCtxT ctx m a
blaze = lazyBytes . renderHtml

app :: Server ()
app = do
middleware $ staticPolicy (addBase "static")
get root $
blaze $ do
H.head $
H.link ! A.href "/css/main.css" ! A.rel "stylesheet"
H.body $
H.h1 "Hello Blaze."

最佳答案

确保您的 static 文件夹位于项目的根目录中,而不是主文件(即 static 文件夹)的根目录中应位于您的 app 和/或 src 文件夹旁边(而不是位于其中)。

在这种情况下,这将是

├── app
│   └── Main.hs
├── static
│   ├── css
│   │   └── main.css

关于haskell - 如何使用 Spock 和 Lucid 提供静态文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57744682/

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