[英]How to serve static files using Spock and Lucid?
使用Haskell,Spock和Lucid開始Web開發,我無法弄清楚如何提供靜態文件。 在Main.hs
的目錄中,我有/static/css/main.css
, Main.hs
包含一個背景顏色,以查看是否確實應用了css。 所以我的目錄樹看起來像
app
├── Main.hs
└── static
└── css
└── main.css
但是,使用以下配置時,找不到main.css
文件(使用Firefox檢查時包含404)。 除此之外,該網站顯示正常。
我曾嘗試模仿funblog示例來提供這些文件(使用Wai),改為Lucid而不是Blaze。 特別是來自Web/Blog.hs
的middleware $ 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."
-- 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 ma 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.