Понимание обработчиков в Ring и Appengine-magic (Clojure) - PullRequest
3 голосов
/ 17 декабря 2010

Я начал работать над некоторыми веб-приложениями clojure и решил использовать комбинацию Ring + Compojure. Недавно я решил попробовать Google Appengine с AppEngine-magic (https://github.com/gcv/appengine-magic). Однако и appengine-magic (через функцию запуска), и функция run-jetty кольца принимают только 1 обработчик в качестве параметра, я реализую несколько обработчиков и хотел бы знать, как развернуть их все.

Спасибо заранее, Ze

Ответы [ 2 ]

5 голосов
/ 17 декабря 2010

Всегда будет только один обработчик верхнего уровня - в конце концов, даже если на каком-то концептуальном уровне есть несколько обработчиков, приложение должно решить, какой из них как-то применить к данному запросу, поэтому процедура, которая делаетвыбор становится обработчиком верхнего уровня.Итак, короткий ответ заключается в том, что вам нужно предоставить функцию, которая будет смотреть на запрос и передавать его соответствующему обработчику среди нескольких обработчиков в вашем приложении;эта функция является обработчиком для run-jetty (или эквивалентного).

Обычно с Ring + Compojure у вас есть несколько базовых («внутренних») обработчиков, предназначенных для обработки определенных URI и некоторых специальныхцелевые обработчики (скажем, для 404) реализованы как промежуточное ПО.Первые, как правило, определяются в формах defroutes, а вторые являются функциями более высокого порядка.

Обработчики промежуточного программного обеспечения сами решают - после просмотра запроса - хотят ли они немедленно вернуть ответ илиделегировать обработчикам они обернуты вокруг.«Внутренние» обработчики на основе маршрута вызываются для соответствующих URI и имеют возможность вернуть nil, чтобы указать, что запрос не имеет для них смысла (в этот момент пробуются остальные обработчики на основе маршрута; если всеnil, окончательный ответ обычно генерируется каким-то промежуточным программным обеспечением, возможно, возвращающим 404).

Я написал длинный ответ относительно Compojure здесь ;возможно, это могло бы оказать некоторую помощь в освоении определений, основанных на маршрутах Compojure.

1 голос
/ 17 декабря 2010

Я не знаю, является ли это лучшим подходом, в итоге я реализовал функцию ring.middleware, которая оборачивает другие обработчики вокруг основного:

(defn wrap-ohandler [f handler]
  (fn [req]
    (let [ res (f req) ]
      (if (= res nil) (handler req) res))))

(def handler-wrapped 
  (-> #'main-handler
    (wrap-ohandler #'anotherhandler )
    (wrap-stacktrace)
    (wrap-params)))

Это работает, но это хороший подход?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...