我正在努力了解如何在Compojure / Ring中正确使用会话。
我遇到的一些例子:
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的一个特性就是抽象开发必须使用响应映射的要求。所以我觉得我必须要错过一些东西。
上述方法的正确方法是什么?
答案 0 :(得分:4)
如果(logged-in request)
返回应呈现的内容,则可以返回正确的响应地图,而不是将:session :username
与logged-in
的结果相关联:
{:body (logged-in request)
:session (assoc session :username username)}
如果您不提供 :status
,:headers
等,则会有不错的默认值。