Перенаправление звонка после входа в систему
(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))))