2011-05-14 4 views
4

J'essaie de savoir comment faire fonctionner les sessions et le flash dans Google App Engine. Quelqu'un pourrait-il donner un exemple clair en utilisant Ring ou Sandbar? Je pense que j'ai travaillé sur le banc de sable, en particulier il ne me dit pas que Var sandbar.stateful-session/sandbar-flash is unbound et quand je vide le gestionnaire, je reçois :flash et :session mais je ne suis pas certain que ce soit une session de barre de sable ou un anneau. Pour être complet, je mentionnerai que j'utilise les dernières versions d'appengine-magic, ring, hoquet et sandbar. Il ne semble y avoir aucune incompatibilité ou problème.Exemple simple de sessions Sandbar ou Ring dans Google App Engine

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

Répondre

4

Je cependant dans ce cas généralement pas envie de répondre à mes questions, je vais faire une exception parce que:

a) Il n'y a pas beaucoup d'exemples faciles à comprendre là-bas.

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

Note: AppEngine-magic n'est pas nécessaire ici, cela travaillera également avec des séances d'anneau 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 utiliser

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

wrap-session! n'est pas nécessaire pour que les sessions fonctionnent, il suffit d'utiliser

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

pour des sessions fonctionnelles fonctionnelles. Cependant je voulais gérer mes sessions avec effets secondaires et wrap-session! fournit cette fonctionnalité. Pour utiliser la fonctionnalité Flash, utilisez simplement session-put! pour mettre une valeur dans la session et ensuite utiliser session-pop! pour l'enlever.

J'espère que c'est utile.