Model view controller 无法在webnoir中使用defroutes

Model view controller 无法在webnoir中使用defroutes,model-view-controller,web-applications,clojure,compojure,noir,Model View Controller,Web Applications,Clojure,Compojure,Noir,所以,我是clojure n00b,在为我正在建设的项目寻找路线时,我遗漏了一些东西 我在循环依赖性方面遇到了一些问题,在使用Django之后,我认为最好将所有路由都定义在一个地方,而不是像使用defpage那样在整个代码库中穿插 关于代码: 这是我的core.clj文件: (ns blktechies-home.core (:use compojure.core hiccup.middleware) (:require [compojure.route :as rout

所以,我是clojure n00b,在为我正在建设的项目寻找路线时,我遗漏了一些东西

我在循环依赖性方面遇到了一些问题,在使用Django之后,我认为最好将所有路由都定义在一个地方,而不是像使用
defpage
那样在整个代码库中穿插

关于代码:

这是我的
core.clj
文件:

(ns blktechies-home.core
  (:use compojure.core
        hiccup.middleware)
  (:require [compojure.route :as route]
            [blktechies-home.routes :as site-routes]
            [compojure.handler :as handler]
            [compojure.response :as response]))

(def app
  (-> (handler/site site-routes/app)
      (wrap-base-url)))
然后在我的routes文件中,我有以下内容:

(ns blktechies-home.routes
  (:use compojure.core
        noir.core
        hiccup.middleware)
  (:require [compojure.route :as route]
            [compojure.handler :as handler]
            [compojure.response :as response]
            [blktechies-home.views.common :as common]))

(defroutes app
  (GET "/" [] (common/main-layout
               (welcome/index-page)))
  (route/resources "/")
  (route/not-found "<h1>NOPE</h1>"))
(ns blktechies-home.routes)
(:使用compojure.core
黑芯
打嗝(打嗝)
(:require[compoure.route:as route]
[compojure.handler:作为处理程序]
[复合响应:作为响应]
[blktechies-home.views.common:as common])
(除路线应用程序)
(获取“/”[](通用/主布局)
(欢迎/索引页)
(路线/资源“/)
(路线/未找到“否”))
一切都是404'ing,我甚至不知道从这里去哪里。我可以使用带有
defpage
的网站,但它看起来很难看,而且随着路由数量的增加,无法扩展

所以

  • 我做错了什么?对底层compojure/clojure/ring层的任何深入了解都将是非常棒的
  • 如果这不是定义路线的最佳方法,那么是什么
  • github上有没有大型clj noir站点的好例子?(我的谷歌fu让我失望了。)

也许您会发现此页面很有用(实现了允许在一个位置定义路由的
defpage
宏变体)。

在Noir中,如果您希望将所有defpage都放在同一位置,您可以将它们一个接一个地放在同一名称空间中。它们可以像委托其他函数来完成“真正”的工作一样简单,就像您在示例中定义(GET”/…)路由一样

我做错了什么?对底层compojure/clojure/ring层的任何深入了解都将是非常棒的

我不确定你做错了什么,你的代码对我来说只需做几处小改动:

加载文件时,只需添加ring.adapter.jetty即可启动jetty服务器的core:

 (ns blktechies-home.core
  (:use compojure.core
        hiccup.middleware
        [ring.adapter.jetty :only [run-jetty]])
  (:require [compojure.route :as route]
            [blktechies-home.routes :as site-routes]
            [compojure.handler :as handler]
            [compojure.response :as response]))

(def app
  (-> (handler/site site-routes/app)
    (wrap-base-url)))

(run-jetty app {:port 8080 :join? false})
您的路由文件,不带“views.common”命名空间:

 (ns blktechies-home.routes
  (:use compojure.core
        noir.core
        hiccup.middleware)
  (:require [compojure.route :as route]
            [compojure.handler :as handler]
            [compojure.response :as response]))

 (defroutes app
   (GET "/" [] "the root path")
   (route/resources "/")
   (route/not-found "<h1>NOPE</h1>"))
并加载核心:

user=> (load-file "src/blktechies_home/core.clj")
#<Server Server@9ae1ab>

在我的谷歌搜索中,我发现了那篇博文,但从我的角度来看,它似乎并不特别优雅。不过,这似乎行得通。谢谢你的全面回复。我的目标是在视图/公共名称空间中调用函数(为了简洁起见,我省略了它)。我将使用添加的jetty代码运行这个程序,并向您报告。好的,我试着让它工作,老实说,我不知道我做错了什么。解除路由似乎有效,但我会重新启动lein,但不会。这意味着我有一些编译问题。最终起作用的是将所有defpage放在routes文件中,然后使用
load views ns
加载routes文件。这可能是一个骇人的解决方案,但它奏效了,我厌倦了摆弄。我会接受这个答案,因为它让我离问题的解决足够近了。
user=> (load-file "src/blktechies_home/core.clj")
#<Server Server@9ae1ab>
wget http://localhost:8080/ -O - -q
the root path