2014-09-30 5 views
2

Compojure/Ring에서 세션을 올바르게 사용하는 방법을 이해하는 데 어려움을 겪고 있습니다. 이러한 예는 나를 로그인 메커니즘 같은으로 세션을 통합하는 방법을 이해하는 데 도움이되지 않습니다Sessions in 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), 그럼 대신 logged-in의 결과에 :session :username 연관의 렌더링해야 할 내용을 반환하는 경우, 당신은 적절한 응답 맵 반환 할 수 있습니다 등

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

:status, :headers는 괜찮은 디폴트 경우가를 당신은 그들을 제공하지 않습니다.

+1

기본값이 사용되지 않는 것으로 보입니다. Chrome은 페이지를 렌더링하는 대신 페이지를 다운로드합니다. 콘텐츠 형식을 수동으로 보내면 중지됩니다. – Chris