Мое решение показано ударом. Просто украсьте мой класс.
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
Это было бы довольно простым промежуточным ПО 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)))
Альтернативой может быть создание перенаправления или прямого ответа в дополнительном маршруте. Примерно так:
(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]
импорт.
(ns compj-test.core
(:use [compojure.core])
(:require
[ring.util.response :as resp]))
(defroutes main-routes
(GET "/" [] (resp/redirect "/index.html")))
То, что вы просите, это перенаправление с / на /index.html. Это так же просто, как (соответственно цель / перенаправление) . Не нужно слишком усложнять вещи.
Это работает просто отлично. Не нужно писать кольцевое промежуточное изделие.
(:require [clojure.java.io :as io])
(defroutes app-routes
(GET "/" [] (io/resource "public/index.html")))
Недавно я обнаружил, что ответ @ 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
ОБНОВЛЕНО: Заменен пример с версией, которая работает.
После просмотра множества ответов здесь я использую следующий код:
(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"))))
Проверьте кольцевые настройки по умолчанию . Он имеет лучшее программное обеспечение, которое вы должны использовать в своих проектах.
если другой код не работает, попробуйте этот код.
(GET "/about/" [] (ring.util.response/content-type
(ring.util.response/resource-response "about/index.html" {:root "public"}) "text/html"))
Просто соображение, Бинита, гоча, с которой я столкнулся. Несмотря на то, что я не смог найти никакой документации относительно важности порядка, определяющего маршруты Compojure, я обнаружил, что это не работает
(GET "/*" [] r/static)
(GET "/" [] (clojure.java.io/resource "public/index.html"))
, в то время как это работает
(GET "/" [] (clojure.java.io/resource "public/index.html"))
(GET "/*" [] r/static)
Очевидно, что *
также соответствует пустой строке, но я подумал, что порядок не должен иметь никакого значения.