Обслуживание файла index.html из compojure

Я новичок в clojure и compojure и пробую compojure вместе с кольцом для создания базового веб-приложения.

вот мой 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))

у меня есть этот файл index.html в папке / resources / public, но приложение не отображает этот html-файл. Вместо этого появляется сообщение Не найдено

Я много его искал, даже этот обслуживать index.html по адресу / by default в Compojure, похоже, не решает проблему.

Не уверен, что мне здесь не хватает.


person navyad    schedule 06.03.2016    source источник


Ответы (3)


Возможно, вы захотите попробовать использовать какую-нибудь библиотеку шаблонов, например 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"}))
person Édipo Féderle    schedule 08.03.2016
comment
это кажется лучшим вариантом, попробовал clostache, это сработало, спасибо. - person navyad; 09.03.2016
comment
Отлично! Да, Clostache тоже вариант - person Édipo Féderle; 09.03.2016

Naveen

Вот мой собственный фрагмент, который, кажется, работает. По сравнению с вашим, у вас нет пути к ресурсу в 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))
person Frank C.    schedule 06.03.2016

Вам не нужно указывать свою маршрутизацию для обслуживания файлов из resoures/public с использованием file-response, в этом каталоге будут обслуживаться благодаря site-defaults. Единственная часть, которую вам не хватает, - это сопоставление / пути с /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, поскольку он обслуживает файлы из пути к классам и будет работать также, когда вы упаковываете свое приложение в файл jar. file-response использует файловую систему для поиска файлов и не работает изнутри файла jar.

person Piotrek Bzdyl    schedule 06.03.2016
comment
Не мог бы тот, кто проголосовал против, объяснить, что не так с моим ответом? Я был бы более чем счастлив исправить это или удалить, если я знаю, почему это неправильно. - person Piotrek Bzdyl; 07.03.2016