2014-09-30 57 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 2014-09-30 16:55:15

回答

4

如果(logged-in request)返回应呈现的,则不用:session :username到的logged-in结果相关联的内容,你可以返回一个适当的反应图:

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

:status:headers等有体面的默认值,如果你不提供它们。

+1

似乎没有使用默认设置 - Chrome正在下载页面而不是呈现它。当我手动发送内容类型时停止。 – Chris 2014-09-30 17:16:11