2010-12-17 53 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))) 

這有效,但這是一個好方法嗎?