2010-12-17 24 views
3

我开始研究一些clojure网络应用程序,并决定使用Ring + Compojure的组合。 最近我决定尝试使用AppEngine-magic的Google Appengine(https://github.com/gcv/appengine-magic)。然而,appengine-magic(通过它的启动函数)和ring的run-jetty函数只需要1个处理程序作为参数,我正在实现几个处理程序,并希望知道如何部署它们。了解Ring和Appengine-magic(Clojure)的处理程序

由于提前, 泽

回答

5

总是只有一个顶级处理程序 - 毕竟,即使在某个概念级别有多个处理程序,应用程序也需要以某种方式决定对某个给定请求应用哪一个,所以例程使选择成为顶级处理程序。所以,最简单的答案就是您需要提供一个函数,它将查看请求并将其交给应用程序中的多个处理程序中的相应处理程序;该函数是给予run-jetty(或等价物)的处理函数。

通常使用Ring + Compojure,你会有一些基本的(“内部”)处理程序,用于处理特定的URI和一些特殊用途的处理程序(比如404s)作为中间件实现。前者倾向于以defroutes的形式进行定义,而后者则是高阶函数。

中间件处理程序在查看请求后自行决定是要立即返回响应还是委托给它们处理的处理程序。为适当的URI调用基于路由的“内部”处理程序,并且可以选择返回nil来指示请求对它们没有意义(此时尝试其余基于路由的处理程序;如果全部都是nil ,最终的响应通常是由一些中间件产生的,可能会返回一个404)。

我写了一篇关于Compojure here的冗长答案;也许这可能对获取Compojure基于路由的处理程序定义的帮助有所帮助。

+0

谢谢,我很累,没有清楚地思考:)这使得很多感觉:)足够有趣我在1天前发布了你的其他帖子:http://twitter.com/#!/zemariamm/status/ 15553561278550016干杯:) – user361526 2010-12-17 10:03:42

+0

乐意帮忙。感谢您的好消息。 :-) – 2010-12-18 01:22:51

1

我不知道这是不是最好的方法,我最终实现一个环绕主逐个处理一个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))) 

这有效,但这是一个好方法吗?