Перенаправление звонка после входа в систему

(ns ...
  (:require  [ring.util.response :refer [ response redirect]))

Мой оригинальный код будет похож на все

(-> (response "You are now logged in! communist party time!")
    (assoc :session new-session)
    (assoc :headers {"Content-Type" "text/html"}))

Что сработало хорошо, но пользователю все равно приходится перемещаться в другое место вручную.

Попытка использовать http://ring-clojure.github.io/ring/ring.util.response.html

(-> (redirect requri)
    (assoc :session new-session)
    (assoc :headers {"Content-Type" "text/html"}))

ничего не делает (кроме возврата пустой страницы).

Как я могу добиться перенаправления на известный URI с помощью кольца?

2 ответа

Решение

response это вернуть тело. ваш код (response requri), но параметр функции reponse это HTML тело, а не URI, вы можете использовать эту функцию

как это

(ns foo
   (:require [ring.util.response :as response]))
(def requi "/")
(-> (response/redirect requri)
    (assoc :session new-session)
    (assoc :headers {"Content-Type" "text/html"}))

PS: если вы пишете веб-сайт. lib-noir - это хороший способ контролировать сеанс и прочее.

У ipaomian есть ответ.

Хотел поделиться хорошим хаком перенаправления:

(ns foo
   (:require [ring.util.response :as response]))

(defn redirect
  "Like ring.util.response/redirect but also accepts key value pairs
   to assoc to response."
  [url & kvs]
  (let [resp (response/redirect url)] 
    (if kvs (apply assoc resp kvs) resp)))

(redirect "/" :session new-session :headers {"Content-Type" "text/html"})

ipaomian прав, однако мой работал, удаляя заголовки. Это мой код:

(:require
    [ring.util.response :refer [redirect]])

(defn set-user! [id {session :session}]
  (-> (redirect "/home")
      (assoc :session (assoc session :user id))))
Другие вопросы по тегам