используя custom: store с wrap-multipart-params в кольцевом промежуточном продукте

Я пытаюсь использовать настраиваемую :store опцию для wrap-multipart-params, и вместо этого я явно получаю магазин по умолчанию. Моя пользовательская функция даже не вызывается.

(mp/wrap-multipart-params 
   (POST "/upload-x" request (upload/upload-file request))
   {:store upload/logging-store})

Моя функция хранилища журналов выглядит так (на данный момент это просто пустышка - в конечном итоге я хочу обрабатывать поток по-своему). Ничего из этого ввода-вывода не происходит.

(defn logging-store [{filename     :filename
                      content-type :content-type
                      stream       :stream
                      :as params}]
  (println "in logging store")
  (pprint filename)
  (pprint params)
  filename)

upload-файл выглядит так:

(defn upload-file [{params :params
                    session :session :as request}]
  (let [user-id (:user-id session)
        files (get params "files")]
    (pprint request)
    (pprint params)
    (response/response
     {:status    :success})))

Печать для запроса и параметров ясно показывает, что там есть составные параметры и что они обрабатываются хранилищем временных файлов:

 :multipart-params
 {"files"
  {:size 1674,
   :tempfile
   #<File /var/folders/rx/9ntjyyvs35qbmcbp6rhfmj200000gn/T/ring-multipart-3853352501927893381.tmp>,
   :content-type "application/octet-stream",
   :filename "blog-test.clj"}},

РЕДАКТИРОВАТЬ: определение приложения (по запросу)

(defroutes file-list-routes
  (GET "/simple-upload" request (upload/simple-upload-file request))
  (mp/wrap-multipart-params 
   (POST "/upload-x"        request (upload/upload-file    request))
   {:store upload/logging-store})
  )


(defroutes scratch-app
  (context "/files" request file-list-routes)
  (route/resources "/")
  (route/not-found "Page not found"))

(def my-app
  (handler/site
   (ring.middleware.json/wrap-json-response
    (ring.middleware.json/wrap-json-params
     (ring.middleware.stacktrace/wrap-stacktrace
      (ring.middleware.session/wrap-session 
       scratch-app
       {:store (ring.middleware.session.memory/memory-store all-the-sessions)
        :cookie-attrs {:max-age 3600 ;in s 3600s = 1h
                       }}))))))

(ring.util.servlet/defservice my-app)

person DrLivingston    schedule 01.04.2014    source источник


Ответы (1)


Функция compojure.handler/site содержит wrap-multipart-params промежуточное ПО, поэтому вы по незнанию применяете составное промежуточное ПО дважды: сначала со значениями по умолчанию, затем с вашими настраиваемыми параметрами. Поскольку сначала применяется составное промежуточное ПО с параметрами по умолчанию, оно имеет приоритет.

person weavejester    schedule 01.04.2014
comment
Арг, я даже ходил искать что-то в этом роде ... Хотя и не подумал заглядывать туда. Похоже, есть параметры для передачи составных параметров (при условии, что они были одинаковыми для всего сайта). - person DrLivingston; 01.04.2014
comment
Почему сначала применяется значение по умолчанию, которое кажется как бы вывернутым наизнанку? - person DrLivingston; 01.04.2014