I'm new to clojure and compojure and trying out the compojure along with ring to create a basic web application.
here is my 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))
i have this index.html file under /resources/public but the application is not rendering this html file. Instead getting Not found
I have searched a lot it, even this Serve index.html at / by default in Compojure does not seems to resolve the issue.
Not sure what am i missing here.
Naveen
Here is a snippet of my own that seems to work. In comparison with yours, you do not have a resource path in 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))
You don't need specify your routing for serving files from resoures/public
using file-response
at this directory will be served thanks to site-defaults
. The only part you are missing is mapping /
path to /index.html
which can be done with the code you mentioned from another question. So the solution would be:
(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)
On a side note, you should prefer using ring.util.response/resource-response
as it serves files from classpath and will work also when you package you app into a jar file. file-response
uses file system to locate files and won't work from inside jar file.
Maybe you want to try use some template library, such as Selmer . So you can do something like this:
(defroutes myapp
(GET "/hello/" []
(render-string (read-template "templates/hello.html"))))
Or passing some value:
(defroutes myapp
(GET "/hello/" [name]
(render-string (read-template "templates/hello.html") {name: "Jhon"})))
And, as @piotrek-Bzdyl said:
(GET "/" [] (resource-response "index.html" {:root "public"}))
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.