【问题标题】:Sessions in Ring/CompojureRing/Compojure 中的会话
【发布时间】:2014-11-25 09:01:20
【问题描述】:

我很难理解如何在 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 的功能之一是抽象出开发必须使用响应图的要求。因此,我觉得我必须错过一些东西。

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

【问题讨论】:

  • compojure 是一个路由库。它抽象了手动决定哪些代码应该处理请求的需要,并且对于从处理函数的请求中获取参数有一些便利。它并没有完全抽象出请求映射的所有用法。

标签: clojure compojure ring


【解决方案1】:

如果(logged-in request) 返回应该呈现的内容,那么您可以返回正确的响应映射,而不是将:session :username 关联到logged-in 的结果:

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

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

【讨论】:

  • 似乎没有使用默认值——Chrome 正在下载页面而不是呈现它。当我手动发送内容类型时,这将停止。
猜你喜欢
  • 2011-04-21
  • 2014-05-25
  • 2013-07-18
  • 2014-01-10
  • 2015-11-26
  • 2015-06-23
  • 2018-12-27
  • 2014-05-11
  • 2013-07-16
相关资源
最近更新 更多