Clojure 环形/复合式会话

Clojure 环形/复合式会话,clojure,compojure,ring,Clojure,Compojure,Ring,我正在努力理解如何正确使用Compojure/Ring中的会话 我遇到的一些例子: 这些示例无法帮助我理解如何将会话集成到登录机制中 (defroutes main-routes (POST "/login" request (views/login request))) ;; views.clj (defn login [request] (let [{params :params} request {username :username} params

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

我遇到的一些例子:

这些示例无法帮助我理解如何将会话集成到登录机制中

(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))))
我意识到这是不正确的,因为登录的
返回hiccup/html,并且我相信在完全评估路线之前不会添加环响应图。这似乎就是为什么上面所有的例子都显示会话被添加到一个完整的响应映射中。但是,Compojure的一个特点是,首先抽象出开发需要使用响应图的需求。因此,我觉得我必须承认我错过了什么

执行上述操作的正确方法是什么?

如果
(登录请求)
返回应呈现的内容,则可以返回正确的响应映射,而不是将
:session:username
关联到
登录的结果上:

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

:status
:headers
等。如果您不提供默认值,则它们具有良好的默认值。

compojure是一个路由库。它抽象了手动决定哪些代码应该处理请求的需要,并为从处理函数的请求中获取参数提供了一些便利。它并没有完全抽象出请求映射的所有用法,似乎没有使用默认值——Chrome正在下载页面,而不是呈现页面。当我手动发送内容类型时,此操作停止。