clojure compojure

clojure - Servir index.html en/por defecto en Compojure



(8)

Después de ver muchas de las respuestas aquí, estoy usando el siguiente código:

(ns app.routes (:require [compojure.core :refer [defroutes GET]] [ring.util.response :as resp])) (defroutes appRoutes ;; ... ;; your routes ;; ... (GET "/" [] (resp/content-type (resp/resource-response "index.html" {:root "public"}) "text/html"))))

  • No redirecciones;
  • No hay necesidad de otro middleware;
  • index.html permanece en la carpeta correcta (resources / public / index.html);
  • Funciona con otro middleware (muchas de las respuestas se rompen cuando se usa con un middleware predeterminado de anillo);
  • Proporciona contenido de tipo, por lo que funciona con middleware de tipo de contenido de envoltura.

Compruebe ring-defaults . Tiene las mejores prácticas de middleware que debe utilizar en sus proyectos.

Tengo un archivo estático llamado index.html que me gustaría servir cuando alguien solicita / . Por lo general, los servidores web hacen esto de manera predeterminada , pero Compojure no lo hace. ¿Cómo puedo hacer que Compojure sirva index.html cuando alguien solicita / ?

Aquí está el código que estoy usando para el directorio estático:

; match anything in the static dir at resources/public (route/resources "/")


Este sería un middleware bastante simple de Ring:

(defn wrap-dir-index [handler] (fn [req] (handler (update-in req [:uri] #(if (= "/" %) "/index.html" %)))))

Simplemente envuelva sus rutas con esta función, y las solicitudes / transformadas en solicitudes de /index.html antes de que el resto de su código las vea.

(def app (-> (routes (your-dynamic-routes) (resources "/")) (...other wrappers...) (wrap-dir-index)))


Esto funciona bien. No hay necesidad de escribir un medio de anillo.

(:require [clojure.java.io :as io]) (defroutes app-routes (GET "/" [] (io/resource "public/index.html")))


Recientemente, descubrí que la respuesta de @ amalloy no funciona cuando la aplicación Clojure / Compojure se ejecuta bajo Jetty o Tomcat como .war. En este caso :path-info necesita ser actualizada. Además, creo que esta versión manejará cualquier ruta, no solo la ruta "raíz".

(defn- wrap-dir-index [handler] (fn [request] (handler (let [k (if (contains? request :path-info) :path-info :uri) v (get request k)] (if (re-find #"/$" v) (assoc request k (format "%sindex.html" v)) request)))))

Consulte también: https://groups.google.com/forum/#!msg/compojure/yzvpQVeQS3w/RNFkFJaAaYIJ

ACTUALIZADO: Ejemplo reemplazado con una versión que funciona.


Solo una consideración Binita, un gotcha que he estado experimentando. A pesar de que no pude encontrar ninguna documentación sobre la importancia del orden que define las rutas de Compojure, descubro que esto no funciona

(GET "/*" [] r/static) (GET "/" [] (clojure.java.io/resource "public/index.html"))

mientras esto funciona

(GET "/" [] (clojure.java.io/resource "public/index.html")) (GET "/*" [] r/static)

Obviamente, el * coincide también con la cadena vacía, pero pensé que el orden no debería importar en absoluto.


Una alternativa podría ser crear una redirección o una respuesta directa en una ruta adicional. Al igual que:

(ns compj-test.core (:use [compojure.core]) (:require [compojure.route :as route] [ring.util.response :as resp])) (defroutes main-routes (GET "/" [] (resp/file-response "index.html" {:root "public"})) (GET "/a" [] (resp/resource-response "index.html" {:root "public"})) (route/resources "/") (route/not-found "Page not found"))

La ruta "/" devuelve una respuesta de archivo de "index.html" que está presente en la carpeta pública. La ruta "/ a" responde directamente "en línea" con el archivo index.html.

Más información sobre las respuestas en anillo: https://github.com/mmcgrana/ring/wiki/Creating-responses

EDIT: eliminó la importación innecesaria [ring.adapter.jetty] .


cuando otro código no funciona, intente este código.

(GET "/about/" [] (ring.util.response/content-type (ring.util.response/resource-response "about/index.html" {:root "public"}) "text/html"))


(ns compj-test.core (:use [compojure.core]) (:require [ring.util.response :as resp])) (defroutes main-routes (GET "/" [] (resp/redirect "/index.html")))

Lo que estás pidiendo es una redirección de / a /index.html. Es tan simple como (resp / redirect target) . No hay necesidad de complicar más las cosas.