我是一个新的clojure和compojure,并尝试使用ring来创建一个基本的Web应用程序。
这是我的handler.clj
(ns gitrepos.handler
(:require [compojure.core :refer :all]
[compojure.route :as route]
[ring.util.response :as resp]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]]))
(defroutes app-routes
(GET "/" [] (resp/file-response "index.html" {:root "public"}))
(route/not-found "Not Found"))
(def app
(wrap-defaults app-routes site-defaults))
我在 / resources / public 下有 index.html 文件,但该应用程序未呈现此html文件。取而代之的是未找到
我已经搜索了很多,即使这Serve index.html at / by default in Compojure似乎无法解决问题。
不确定我在这里缺少什么。
答案 0 :(得分:1)
纳温
这是我自己的片段似乎有用。与您的相比,defroutes
中没有资源路径:
(defroutes default-routes
(route/resources "public")
(route/not-found
"<h1>Resource you are looking for is not found</h1>"))
(defroutes app
(wrap-defaults in-site-routes site-defaults)
(wrap-defaults test-site-routes site-defaults)
(wrap-restful-format api-routes)
(wrap-defaults default-routes site-defaults))
答案 1 :(得分:0)
由于resoures/public
,您无需使用file-response
来指定您使用site-defaults
的{{1}}服务文件的路由。您唯一缺少的部分是将/
路径映射到/index.html
,这可以使用您在其他问题中提到的代码来完成。所以解决方案是:
(defn wrap-dir-index [handler]
(fn [req]
(handler
(update
req
:uri
#(if (= "/" %) "/index.html" %)))))
(defroutes app-routes
(route/not-found "Not Found"))
(def app
(-> app-routes
(wrap-defaults site-defaults)
(wrap-dir-index)
另外,您应该更喜欢使用ring.util.response/resource-response
,因为它提供来自classpath的文件,并且当您将应用程序打包到jar文件中时也会起作用。 file-response
使用文件系统来查找文件,并且无法在jar文件中使用。
答案 2 :(得分:0)
也许您想尝试使用一些模板库,例如Selmer。所以你可以这样做:
(defroutes myapp
(GET "/hello/" []
(render-string (read-template "templates/hello.html"))))
或传递一些价值:
(defroutes myapp
(GET "/hello/" [name]
(render-string (read-template "templates/hello.html") {name: "Jhon"})))
而且,正如@ piotrek-Bzdyl所说:
(GET "/" [] (resource-response "index.html" {:root "public"}))