我正在使用Compojure(以及Ring和相关的中间件)在Clojure中编写一个API。 我试图根据路线应用不同的validation码。 考虑下面的代码: (defroutes public-routes (GET "/public-endpoint" [] ("PUBLIC ENDPOINT"))) (defroutes user-routes (GET "/user-endpoint1" [] ("USER ENDPOINT 1")) (GET "/user-endpoint2" [] ("USER ENDPOINT 1"))) (defroutes admin-routes (GET "/admin-endpoint" [] ("ADMIN ENDPOINT"))) (def app (handler/api (routes public-routes (-> user-routes (wrap-basic-authentication user-auth?))))) (-> admin-routes (wrap-basic-authentication admin-auth?))))) 这不能按预期的方式工作,因为wrap-basic-authentication的确包装了路由,所以无论缠绕的路由如何都可以尝试。 具体来说,如果请求需要路由到admin-routes , user-auth? 仍然会被尝试(并失败)。 我使用context来根据一个共同的基本path下的一些路由,但它是一个相当的约束(下面的代码可能无法正常工作,只是为了说明这个想法): (defroutes user-routes (GET "-endpoint1" [] […]
注意 鉴于这个OP是在两年前写的,而不是再次提出同样的问题,我想知道是否存在分步说明,以便我可以将Noir或其他Clojure Web应用程序集成到Apache中,无论是Jetty,Tomcat , 或者是其他东西。 Django也有类似的说明,我认为我知道Python在Django的情况下是作为一个引擎而不是一个环形框架运行的,所以Clojure的web应用程序更加复杂。 结束注释 我深深爱上了Clojure,而Compojure看起来像是一个整洁的Web框架。 但是,当我想将我的应用程序部署在像Tomcat这样的常规应用程序服务器上时,这一切都崩溃了。 实际上,我必须为静态文件和资源编写自定义的Ring处理程序,这些文件和资源可以在本地的Jetty和Tomcat上工作,因为库存处理程序没有,并且我必须在任何地方手动预置上下文根。 我感到非常惊讶的是,我不得不编写所有这些代码来创build可以在Jetty和Tomcat上运行的最简单的Web应用程序。 我只有三个可能的解释: 没有人使用Clojure / Compojure进行本地开发,例如在生产中 每个人都在没有上下文根的专用Jetty上部署Clojure / Compojure应用程序(像Node.js应用程序一样) 有一个非常简单的方法来规避我碰到的问题,我没有意识到 你认为哪个是这种情况? 或者是别的什么? 编辑: 请注意,创build一个战争文件是Maven / Leiningen,而不是我的意思。 我想知道我必须编写如此多的代码才能使Compojure能够与Tomcat一起工作,像静态文件服务和上下文根认知这样的基本function应该可以直接使用。