部署compojure/sinatra应用程序的首选方法是什么?我在主机上运行了多个站点,因此我无法在端口80上运行jetty/mongrel.我应该如何处理在同一主机上运行的多个站点/应用程序?
有没有办法在打嗝时设置div背景颜色?这是我到目前为止尝试过的,没有结果:
[:div {:background-color "#003366"} (escape-html rest)]
在html中,我看到<div background-color="#663366">哪些我不相信是正确的颜色格式.
打嗝有没有办法做到这一点?
我是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) 假设我有这个处理程序:
(defroutes routes
(DELETE "/books" [id] (delete-book id)))
Run Code Online (Sandbox Code Playgroud)
当请求不包含ID时,如何使该应用返回HTTP 404?
我使用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) 我正在尝试为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) 我已经为此苦苦挣扎了两天多了,似乎还没有找到解决方案。
因此,我想做的就是在浏览器中显示图像,但是当我调用端点时,会发生以下情况:
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) 我是新手使用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) 我正在尝试编写一个自定义中间件,通过检查请求中是否存在以下内容来检查用户是否已通过身份验证.
(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中间件中需要实现的逻辑.如何编写破坏中间件链的中间件,只返回自定义响应或重定向到处理程序?
我想能够模拟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)