我正在努力研究如何在Google App Engine中使用会话和Flash。有人可以使用Ring或Sandbar提供一个明确的例子吗?我认为我有沙洲工作,特别是它没有告诉我Var sandbar.stateful-session/sandbar-flash is unbound
当我转储处理程序时我得到:flash
和:session
虽然我不确定这是否是沙洲会话或戒指。为了完整起见,我会提到我正在使用最新版本的appengine-magic,ring,hiccup和sandbar。似乎没有任何不兼容性或问题。
这是一个明显的例子,最好使用flash-put!, flash-get, session-put! and session-get
。
答案 0 :(得分:4)
我通常不喜欢回答我自己的问题,但是在这种情况下,我会例外,因为:
a)那里没有很多易于理解的例子。
b)为其他人提供一个快速工作的例子会很好。
注意:此处不需要appengine-magic,这也适用于正常的铃声会话
<强>代码强>
;; Place in a file called session.clj in the example project
(ns example.session
"Works with the normal ring sessions
allowing you to use side-effects to manage them")
(declare current-session)
(defn wrap-session! [handler]
(fn [request]
(binding [current-session (atom (or (:session request) {}))]
(let [response (handler request)]
(assoc response :session @current-session)))))
(defn session-get
([k] (session-get k nil))
([k default] (if (vector? k)
(get-in @current-session k)
(get @current-session k default))))
(defn session-put!
([m]
(swap! current-session (fn [a b] (merge a m)) m))
([k v]
(swap! current-session (fn [a b] (merge a {k b})) v)))
(defn session-pop! [k]
(let [res (get @current-session k)]
(swap! current-session (fn [a b] (dissoc a b)) k)
res))
(defn session-delete-key! [k]
(swap! current-session (fn [a b] (dissoc a b)) k))
(defn session-destroy! []
(swap! current-session (constantly nil)))
;; Place in a file called core.clj in the example project
(ns example.core
(:use compojure.core
[ring.middleware.keyword-params :only [wrap-keyword-params]]
[ring.middleware.session :only [wrap-session]]
[ring.middleware.session.cookie :only [cookie-store]]
[example session])
(:require [appengine-magic.core :as ae]))
(declare current-session)
(defroutes example-app-routes
(GET "/" _
(fn [req]
(let [counter (session-get :counter 0)]
{:status 200
:headers {"Content-Type" "text/plain"}
:body (str "started: " counter)})))
(GET "/inc" _
(fn [req]
(let [counter (do
(session-put! :counter (inc (session-get :counter 0)))
(session-get :counter))]
{:status 200
:headers {"Content-Type" "text/plain"}
:body (str "incremented: " counter)}))))
(def example-app-handler
(-> #'example-app-routes
wrap-keyword-params
wrap-session!
(wrap-session {:cookie-name "example-app-session"
:store (cookie-store)})))
(ae/def-appengine-app example-app #'example-app-handler)
如何使用
导航到http://127.0.0.1:8080/inc增加会话中的计数器,http://127.0.0.1:8080/将在会话中显示计数器的值。
涡卷会话!只需使用
,会话就不需要工作(wrap-session {:cookie-name "example-app-session"
:store (cookie-store)})
将为您提供有效的功能课程。但是我想用副作用和包装会话来管理我的会话!提供该功能。要使用类似flash的功能,只需使用session-put!将值放入会话然后使用session-pop!删除它。
希望这有帮助。
答案 1 :(得分:1)
如果您想使用GAE提供的会话,可以使用以下
https://gist.github.com/1095841
在您的请求中包含类似会话的响铃,但基于GAE会话支持。
如果你想在此基础上建立有状态会话,你可以使用Sandbar提供的有状态会话API