Question

J'essaie de comprendre comment faire fonctionner les sessions et le flash dans Google App Engine.Quelqu'un pourrait-il fournir un exemple clair en utilisant Ring ou Sandbar ?Je pense que mon banc de sable fonctionne, en particulier, cela ne me dit pas cela Var sandbar.stateful-session/sandbar-flash is unbound et quand je vide le gestionnaire, j'obtiens :flash et :session même si je ne sais pas s'il s'agit d'une session sur banc de sable ou en ring.Pour être complet, je mentionnerai que j'utilise les dernières versions d'appengine-magic, ring, hiccup et sandbar.Il ne semble y avoir aucune incompatibilité ou problème.

Donc un exemple clair de préférence avec l'utilisation de flash-put!, flash-get, session-put! and session-get.

Était-ce utile?

La solution

Je n'aime généralement pas répondre à mes propres questions, mais dans ce cas, je ferai une exception car :

a) Il n’existe pas beaucoup d’exemples faciles à comprendre.

b) Ce serait bien d'avoir un exemple de travail rapide que d'autres pourraient utiliser.

Note:appengine-magic n'est pas requis ici, cela fonctionnera également avec des sessions de sonnerie normales

Code

;; 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)

Comment l'utiliser

Navigation vers http://127.0.0.1:8080/inc incrémente le compteur dans la session et http://127.0.0.1:8080/ affichera la valeur du compteur dans la session.

séance de clôture !n'est pas nécessaire pour que les sessions fonctionnent, il suffit d'utiliser

(wrap-session {:cookie-name "example-app-session"
                     :store (cookie-store)})

vous donnera des séances fonctionnelles de travail.Cependant je souhaitais gérer mes séances avec des effets secondaires et des séances enveloppantes !fournit cette fonctionnalité.Pour utiliser les fonctionnalités de type Flash, utilisez simplement session-put !pour mettre une valeur dans la session, puis utilisez session-pop !pour le supprimer.

J'espère que c'est utile.

Autres conseils

Si vous souhaitez utiliser les sessions fournies par GAE, vous pouvez utiliser les éléments suivants

https://gist.github.com/1095841

pour inclure une session de type anneau dans vos demandes, mais basée sur la prise en charge de la session GAE.

Si vous souhaitez en plus des sessions avec état, vous pouvez utiliser l'API de session avec état fournie par Sandbar.

https://github.com/brentonashworth/sandbar

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top