Ring, redirect with flash

482 views
Skip to first unread message

Luis Medina

unread,
Sep 13, 2017, 9:49:39 PM9/13/17
to Clojure
Hello to everybody!

I'm pretty new in clojure, i trying to figure out how to redirect to another page with a flash value with a error message, could be something easy but i don't understood how to make that. Session it's relatibely fine, but flash it's empty every time. It's really dificult to find good and updated examples and answers.

(ns my-app.routes.auth
  (:require [my-app.layout :as layout]
            [my-app.db.core :as db]
            [my-app.db.user :as dbuser]
            [compojure.core :refer [defroutes GET POST]]
            [ring.util.response :refer [response redirect]]
            [clojure.java.io :as io]
            [buddy.auth :refer [authenticated?]]))

(defn login-page
  [request]
  (layout/render "login.html" (println (:flash request))))

(defn login-authenticate
  [request]
  (let [username (get-in request [:form-params "username"])
        password (get-in request [:form-params "password"])
        session (:session request)]
    (if (dbuser/check-password username password)
      (let [updated-session (assoc session
                                   :identity (:id (db/get-user-id {:username username})))]
        (-> (redirect "/")
            (assoc :session updated-session))))
    (assoc (redirect "/") :flash "errro")))

(defn logout-authenticate
  [{session :session}]
  (-> (redirect "/login")
      (assoc :session (dissoc session :identity))))

(defroutes routes
  (GET "/login" [] login-page)
  (POST "/login" [] login-authenticate)
  (GET "/logout" [] logout-authenticate))



As you can see i have a println in login-page just for see in the console output if :flash have something...

Thanks for taking the time to read.

Sean Corfield

unread,
Sep 13, 2017, 11:11:59 PM9/13/17
to clo...@googlegroups.com

Do you have the wrap-flash middleware in place?

 

Sean Corfield -- (970) FOR-SEAN -- (904) 302-SEAN
An Architect's View -- http://corfield.org/

"If you're not annoying somebody, you're not really alive."
-- Margaret Atwood

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

 

James Reeves

unread,
Sep 13, 2017, 11:37:02 PM9/13/17
to clo...@googlegroups.com
You haven't included the code where the flash and session middleware are applied to the handler, or the handler that consumes the flash message.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.



--
James Reeves

Luis Medina

unread,
Sep 14, 2017, 10:54:46 AM9/14/17
to Clojure
Are you right, well i'm using the luminus template, it have ring's flash wrapper by default is not?

(ns my-app.middleware
 
(:require [my-app.env :refer [defaults]]
           
[cognitect.transit :as transit]
           
[clojure.tools.logging :as log]
           
[my-app.layout :refer [*app-context* error-page]]
           
[ring.middleware.anti-forgery :refer [wrap-anti-forgery]]
           
[ring.middleware.webjars :refer [wrap-webjars]]
           
[muuntaja.core :as muuntaja]
           
[muuntaja.format.transit :as transit-format]
           
[muuntaja.middleware :refer [wrap-format wrap-params]]
           
[my-app.config :refer [env]]
           
[ring.middleware.flash :refer [wrap-flash]]
           
[immutant.web.middleware :refer [wrap-session]]
           
[ring.middleware.defaults :refer [site-defaults wrap-defaults]]
           
[buddy.auth.middleware :refer [wrap-authentication wrap-authorization]]
           
[buddy.auth.accessrules :refer [restrict]]
           
[buddy.auth :refer [authenticated?]]
           
[buddy.auth.backends.session :refer [session-backend]]
           
[taoensso.tempura :as tempura :refer [tr]]
           
[my-app.i18n :as i18n :refer [tconfig]])
 
(:import [javax.servlet ServletContext]
           
[org.joda.time ReadableInstant]))

(defn wrap-context [handler]
 
(fn [request]
   
(binding [*app-context*
             
(if-let [context (:servlet-context request)]
               
;; If we're not inside a servlet environment
                ;; (for example when using mock requests), then
                ;; .getContextPath might not exist
                (try (.getContextPath ^ServletContext context)
                     (catch IllegalArgumentException _ context))
                ;; if the context is not specified in the request
                ;; we check if one has been specified in the environment
                ;; instead
                (:app-context env))]
      (handler request))))

(defn wrap-internal-error [handler]
  (fn [req]
    (try
      (handler req)
      (catch Throwable t
        (log/error t)
        (error-page {:status 500
                     :title "Something very bad has happened!"
                     :message "We'
ve dispatched a team of highly trained gnomes to take care of the problem."})))))

(defn wrap-csrf [handler]
  (wrap-anti-forgery
   handler
   {:error-response
    (error-page
     {:status 403
      :title "
Invalid anti-forgery token"})}))

(defn wrap-i18n
  [handler]
  (tempura/wrap-ring-request handler {:tr-opts i18n/tconfig}))

(def joda-time-writer
  (transit/write-handler
   (constantly "
m")
   (fn [v] (-> ^ReadableInstant v .getMillis))
   (fn [v] (-> ^ReadableInstant v .getMillis .toString))))

(def restful-format-options
  (update
    muuntaja/default-options
    :formats
    merge
    {"
application/transit+json"
     {:decoder [(partial transit-format/make-transit-decoder :json)]
      :encoder [#(transit-format/make-transit-encoder
                   :json
                   (merge
                     %
                     {:handlers {org.joda.time.DateTime joda-time-writer}}))]}}))

(defn wrap-formats [handler]
  (let [wrapped (-> handler wrap-params (wrap-format restful-format-options))]
    (fn [request]
      ;; disable wrap-formats for websockets
      ;; since they're not compatible with this middleware
      ((if (:websocket? request) handler wrapped) request))))

(defn on-error [request response]
  (error-page
    {:status 403
     :title (str "
Access to " (:uri request) " is not authorized")}))

(defn wrap-restricted [handler]
  (restrict handler {:handler authenticated?
                     :on-error on-error}))

(defn wrap-auth [handler]
  (let [backend (session-backend)]
    (-> handler
        (wrap-authentication backend)
        (wrap-authorization backend))))

(defn wrap-base [handler]
  (-> ((:middleware defaults) handler)
      wrap-i18n
      wrap-auth
      wrap-webjars
      wrap-flash
      (wrap-session {:cookie-attrs {:http-only true}})
      (wrap-defaults
       (-> site-defaults
           (assoc-in [:security :anti-forgery] false)
           (dissoc :session)))
      wrap-context
      wrap-internal-error))


Reply all
Reply to author
Forward
0 new messages