标签: compojure

部署Compojure/Sinatra应用程序

部署compojure/sinatra应用程序的首选方法是什么?我在主机上运行了多个站点,因此我无法在端口80上运行jetty/mongrel.我应该如何处理在同一主机上运行的多个站点/应用程序?

ruby clojure sinatra compojure

3
推荐指数
1
解决办法
1316
查看次数

在打嗝中改变div颜色

有没有办法在打嗝时设置div背景颜色?这是我到目前为止尝试过的,没有结果:

[:div {:background-color "#003366"} (escape-html rest)]

在html中,我看到<div background-color="#663366">哪些我不相信是正确的颜色格式.

打嗝有没有办法做到这一点?

html clojure compojure hiccup

3
推荐指数
1
解决办法
267
查看次数

Clojure警告:"结果集-seq已存在于clojure.core中"

我是Clojure的新手并使用Noir框架构建一个Web应用程序(非常类似于Compojure,实际上我认为它是具有不同请求处理程序层的Compojure).我在导入JDBC库时收到警告:

WARNING: resultset-seq already refers to: #'clojure.core/resultset-seq in namespace: webapp.models.database, being replaced by: #'clojure.java.jdbc/resultset-seq
Run Code Online (Sandbox Code Playgroud)

我是否必须接受这个警告,或者有办法吗?我正在使用以下方法导入JDBC库:

(use 'clojure.java.jdbc)
Run Code Online (Sandbox Code Playgroud)

clojure compojure noir

3
推荐指数
1
解决办法
719
查看次数

Compojure-未提供所需参数时如何返回404?

假设我有这个处理程序:

(defroutes routes
  (DELETE    "/books"      [id]              (delete-book id)))
Run Code Online (Sandbox Code Playgroud)

当请求不包含ID时,如何使该应用返回HTTP 404?

clojure compojure

3
推荐指数
1
解决办法
2131
查看次数

从compojure和ring提供静态文件

我使用lein创建了一个项目,然后在项目的根目录中创建了一个目录public来放置静态内容.

但是,静态内容未按预期提供.

这是defroutes:

(defroutes greeter
  (GET "/greeter/working" []
    (html
      [:html
        [:head [:tile "bla"]]
        [:body [:image "oops.jpg"]]
       ]
      )
    )
  (GET "/greeter/sayhi" [] "say hi")
  (GET "/greeter/" [] "top level")
  (route/files "/" {:root (str (System/getProperty "user.dir") "\\public")})

(defn -main []
  (run-jetty greeter {:port 3000 :join? false}))
Run Code Online (Sandbox Code Playgroud)

clojure compojure ring

3
推荐指数
1
解决办法
2625
查看次数

在compojure中测试静态路由

我正在尝试为compojure静态内容路由编写测试。我正在通过直接检查振铃响应来测试路由。

一个最小的工作示例如下:

;; src/testing-webapps.core.clj
(ns testing-webapps.core
  (:use [compojure.core]
        [compojure.route   :as route]))

(defroutes web-app
   (route/resources "/")
   (route/not-found "404"))


;; test/testing-webapps.core_test.clj
(ns testing-webapps.core-test
  (:require [clojure.test :refer :all]
            [testing-webapps.core :refer :all]))

(defn request [resource web-app & params]
  (web-app {:request-method :get :uri resource :params (first params)}))

(deftest test-routes
  (is (= 404 (:status (request "/flubber" web-app))))
  (is (= "404" (:body (request "/flubber" web-app))))
  (is (= 200 (:status (request "/test.txt" web-app)))))
Run Code Online (Sandbox Code Playgroud)

测试404路由效果很好,但调用(request "/test.txt" web-app)会导致出现意外NullPointerException情况ring.middleware.file-info/not-modified-since?

这是堆栈跟踪的顶部:

ERROR in (test-routes) (file_info.clj:27)
Uncaught …
Run Code Online (Sandbox Code Playgroud)

testing clojure compojure

3
推荐指数
1
解决办法
1047
查看次数

Compojure 显示图像时遇到问题

我已经为此苦苦挣扎了两天多了,似乎还没有找到解决方案。

因此,我想做的就是在浏览器中显示图像,但是当我调用端点时,会发生以下情况:

Cannot JSON encode object of class: class java.io.File
Run Code Online (Sandbox Code Playgroud)

端点

(context "/servers" []
           :datomic true

           (GET "/:id/graph/:panel-type" {db :db user :user}
                :summary "Return a server graph image"
                :path-params [id :- Long
                              panel-type :- String]
                (let [file-path (str panel-type ".png")

                      result (-> (response/response (clojure.java.io/file file-path))
                                 (response/content-type "image/png")))]

                  (ok result)))) ;; ring.util.http-response
Run Code Online (Sandbox Code Playgroud)

我是 compojure API 的新手,但有些事情让我觉得中间件实现存在问题 - 自定义格式?

中间件

(defn wrap-formats [handler]
  (let [wrapped (wrap-restful-format
                  handler
                  {:formats [:json-kw :transit-json :transit-msgpack]})]
    (fn [request]
      ;; disable wrap-formats for websockets
      ;; since they're not …
Run Code Online (Sandbox Code Playgroud)

image response clojure compojure

3
推荐指数
1
解决办法
567
查看次数

如何从compojure API流式传输大型CSV响应,以便整个响应不会立即保存在内存中?

我是新手使用compojure,但到目前为止一直喜欢使用它.我目前在我的一个API端点中遇到一个问题,即从数据库生成一个大的CSV文件,然后将其作为响应主体传递.

我似乎遇到的问题是整个CSV文件被保存在内存中,然后导致API中的内存不足错误.处理和生成这个的最佳方法是什么,理想情况下是一个gzip压缩文件?是否可以流式传输响应,以便一次返回几千行?当我为相同的数据返回JSON响应主体时,返回它没有问题.

这是我用来返回的当前代码:

(defn complete
  "Returns metrics for each completed benchmark instance"
  [db-client response-format]
  (let [benchmarks  (completed-benchmark-metrics {} db-client)]
    (case response-format
      :json  (json-grouped-output field-mappings benchmarks)
      :csv   (csv-output benchmarks))))

(defn csv-output [data-seq]
  (let [header (map name (keys (first data-seq)))
        out    (java.io.StringWriter.)
        write  #(csv/write-csv out (list %))]
    (write header)
    (dorun (map (comp write vals) data-seq))
    (.toString out)))
Run Code Online (Sandbox Code Playgroud)

data-seq是从数据库返回的结果,我认为这是一个懒惰的序列.我正在使用yesql来执行数据库调用.

以下是此API端点的compojure资源:

(defresource results-complete [db]
  :available-media-types  ["application/json" "text/csv"]
  :allowed-methods        [:get]
  :handle-ok              (fn [request]
                            (let [response-format (keyword (get-in request [:request :params :format] :json))
                                  disposition …
Run Code Online (Sandbox Code Playgroud)

csv clojure out-of-memory large-files compojure

3
推荐指数
1
解决办法
762
查看次数

在Compojure中绕过链的自定义中间件

我正在尝试编写一个自定义中间件,通过检查请求中是否存在以下内容来检查用户是否已通过身份验证.

(defn wrap-authenticated [handler]
  (fn [{user :user :as req}]
    (if (nil? user)
      (do 
        (println "unauthorized")
        {:status 401 :body "Unauthorized." :headers {:content-type "text/text"}})
      (handler req))))

(def app
  (wrap-authenticated (wrap-defaults app-routes (assoc site-defaults :security false))))
Run Code Online (Sandbox Code Playgroud)

但是当我尝试返回401状态的响应hashmap时,我得到以下异常: WARN:oejs.AbstractHttpConnection:/ main java.lang.ClassCastException:clojure.lang.Keyword无法强制转换为java.lang.String

也许我不理解在Compojure中间件中需要实现的逻辑.如何编写破坏中间件链的中间件,只返回自定义响应或重定向到处理程序?

clojure compojure ring

2
推荐指数
1
解决办法
154
查看次数

如何使用with-redefs模拟对同一函数的多个调用?

我想能够模拟MyFunction然而我需要模拟在MyFunction调用时返回不同的值.

是否可以with-redefs根据函数的调用顺序返回不同的值?

(testing "POST /foo/bar and return ok"
  (with-redefs [->Baz (fn [_]
                    (reify MyProtocol (MyFunction [_] [{:something 1}]))
                    (reify MyProtocol (MyFunction [_] [{:something 2}])))]

    (let [response (routes/foo {:request-method :post
                            :uri            "/foo/bar"
                            :query-params   {}
                            })]

      (is (= (:status response) 200)))))
Run Code Online (Sandbox Code Playgroud)

unit-testing clojure mocking compojure

2
推荐指数
1
解决办法
160
查看次数