Ring / Compojure中的会话

时间:2014-09-30 16:35:47

标签: clojure compojure ring

我正在努力了解如何在Compojure / Ring中正确使用会话。

我遇到的一些例子:

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返回hiccup / html并且我相信在完全评估路由之后才会添加响铃映射。这似乎是所有上述示例显示会话被添加到完整响应映射的原因。但是,Compojure的一个特性就是抽象开发必须使用响应映射的要求。所以我觉得我必须要错过一些东西。

上述方法的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

如果(logged-in request)返回应呈现的内容,则可以返回正确的响应地图,而不是将:session :usernamelogged-in的结果相关联:

{:body (logged-in request)
 :session (assoc session :username username)}
如果您不提供

:status:headers等,则会有不错的默认值。