2014-09-30 5 views
2

Я борюсь с пониманием того, как правильно использовать сеансы в Compojure/Ring.Сессии в Ring/Compojure

Некоторые из примеров, которые я наткнулась:

https://github.com/brentonashworth/sandbar-examples/blob/master/sessions/src/sandbar/examples/session_demo.clj

http://rjevans.net/post/2628238502/session-support-in-compojure-ring

https://github.com/ring-clojure/ring/wiki/Sessions

Эти примеры не помогают мне понять, как интегрировать сессии в нечто вроде механизма авторизации.

(defroutes main-routes 
    (POST "/login" request (views/login request))) 

;; views.clj 
(defn login 
    [request] 
    (let [{params :params} request 
     {username :username} params 
     {password :password} params 
     {session :session} request] 
    (if (db/valid-user? username password) 
    (-> (logged-in request) 
     (assoc-in [:session :username] username)) 
     (not-logged-in)))) 

Я понимаю, что это не правильно, как logged-in возвращает икать/html, и я считаю, что карта ответа кольца не не добавляется, пока после того, как маршрут будет полностью оценен. Похоже, что все приведенные выше примеры показывают, что сеансы добавляются к полной карте ответа. Но одна из особенностей Compojure для начала заключалась в том, чтобы отвлечься от потребности разработки, которая должна работать с картой ответа. Поэтому я чувствую, что мне что-то недоставало.

Каким будет правильный способ сделать это?

+0

compojure - это библиотека маршрутизации. Он абстрагируется от необходимости вручную решить, какой код должен обрабатывать запрос, и имеет некоторые удобства для получения параметров из запроса для функции обработчика. Он не полностью абстрагирует все использование карты запросов. – noisesmith

ответ

4

Если (logged-in request) возвращает содержимое, которое должно быть оказано, то вместо того, чтобы связать :session :username на результаты logged-in, вы можете вернуть правильную карту ответа:

{:body (logged-in request) 
:session (assoc session :username username)} 

:status, :headers и т.д. имеет достойные значения по умолчанию, вы не предоставляете их.

+1

Похоже, что значения по умолчанию не используются - Chrome загружает страницу вместо ее рендеринга. Это прекращается, когда я вручную отправляю тип содержимого. – Chris