Служите index.html по умолчанию в Compojure

Мое решение показано ударом. Просто украсьте мой класс.

from django.views.decorators.csrf import csrf_exempt
@method_decorator(csrf_exempt, name='dispatch')
@method_decorator(basic_auth_required(
    target_test=lambda request: not request.user.is_authenticated
), name='dispatch')
class GenPedigreeView(View):
    pass
29
задан Kevin Burke 11 October 2011 в 17:20
поделиться

8 ответов

Это было бы довольно простым промежуточным ПО Ring:

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

Просто оберните ваши маршруты с помощью этой функции, и запросы на / преобразуются в запросы на /index.html до того, как остальная часть вашего кода увидит им.

(def app (-> (routes (your-dynamic-routes)
                     (resources "/"))
             (...other wrappers...)
             (wrap-dir-index)))
21
ответ дан hyperboreean 11 October 2011 в 17:20
поделиться

Альтернативой может быть создание перенаправления или прямого ответа в дополнительном маршруте. Примерно так:

(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"))

Маршрут "/" возвращает ответ файла "index.html", который присутствует в общей папке. Маршрут «/ a» отвечает напрямую, «вставляя» файл index.html.

Подробнее об ответах на звонок: https://github.com/mmcgrana/ring/wiki/Creating-responses

РЕДАКТИРОВАТЬ: удален ненужный [ring.adapter.jetty] импорт.

39
ответ дан Dhruv Chandna 11 October 2011 в 17:20
поделиться
(ns compj-test.core
  (:use [compojure.core])
  (:require
        [ring.util.response :as resp]))

(defroutes main-routes
  (GET "/" [] (resp/redirect "/index.html")))

То, что вы просите, это перенаправление с / на /index.html. Это так же просто, как (соответственно цель / перенаправление) . Не нужно слишком усложнять вещи.

26
ответ дан jandrewthompson 11 October 2011 в 17:20
поделиться

Это работает просто отлично. Не нужно писать кольцевое промежуточное изделие.

(:require [clojure.java.io :as io])

(defroutes app-routes 
(GET "/" [] (io/resource "public/index.html")))
19
ответ дан Binita Bharati 11 October 2011 в 17:20
поделиться

Недавно я обнаружил, что ответ @ amalloy не работает, когда приложение Clojure / Compojure работает под Jetty или Tomcat как .war. В этом случае :path-info необходимо обновить. Кроме того, я думаю, что эта версия будет обрабатывать любой маршрут, а не только «корневой» маршрут.

(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)))))

Смотрите также: https://groups.google.com/forum/#!msg/compojure/yzvpQVeQS3w/RNFkFJaAaYIJ

ОБНОВЛЕНО: Заменен пример с версией, которая работает.

3
ответ дан tvaughan 11 October 2011 в 17:20
поделиться

После просмотра множества ответов здесь я использую следующий код:

(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"))))
  • Нет перенаправлений;
  • Нет необходимости в другом промежуточном программном обеспечении;
  • index.html находится в нужной папке (resources / public / index.html);
  • Работает с другим промежуточным ПО (многие ответы ломаются при использовании с некоторым промежуточным ПО по умолчанию);
  • Он предоставляет тип контента, поэтому работает с промежуточным ПО типа wrap-content.

Проверьте кольцевые настройки по умолчанию . Он имеет лучшее программное обеспечение, которое вы должны использовать в своих проектах.

9
ответ дан fasfsfgs 11 October 2011 в 17:20
поделиться

если другой код не работает, попробуйте этот код.

(GET "/about/" [] (ring.util.response/content-type
                     (ring.util.response/resource-response "about/index.html" {:root "public"}) "text/html"))
1
ответ дан Kazuhiro Hara 11 October 2011 в 17:20
поделиться

Просто соображение, Бинита, гоча, с которой я столкнулся. Несмотря на то, что я не смог найти никакой документации относительно важности порядка, определяющего маршруты Compojure, я обнаружил, что это не работает

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

, в то время как это работает

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

Очевидно, что * также соответствует пустой строке, но я подумал, что порядок не должен иметь никакого значения.

0
ответ дан Jaime Agudo 11 October 2011 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: