我正在尝试使用Docker开始使用Clojure开发Web应用程序,并且不确定要走哪条路.从我到目前为止所阅读的内容以及正式的Docker Clojure回购中,基本上有两种可能的方法:
lein ring server(交互式或作为Dockerfile中的CMD)或java -jar用作CMD生成的jar文件.前者在我认为开发环境不尽可能接近生产环境的意义上是有问题的,因为我们可能正在使用:devleiningen配置文件添加人们在生产中严格不需要的东西(提供的数量很少)工具和"信息",即暴露的生产服务器上的代码总是一个好主意.然而,后者似乎有完全相反的问题:现在每个更改都需要基本上重建图像(想想编辑 - 编译 - 运行周期),因此您将失去lein ring对修改功能的良好重新编译.
人们如何在实践中使用这种组合?
PS:我知道在实践中可能还有其他一些操作模式(例如使用Immutant或Tomcat作为部署目标或使用像Hudson这样的CI服务器等).我先问这里最基本的设置.
当我启动当前项目lein ring server并尝试通过苹果酒从Emacs连接到它时,我收到以下警告:
; CIDER 0.8.2 (Java 1.7.0_51, Clojure 1.6.0, nREPL 0.2.6)
WARNING: The following required nREPL ops are not supported:
apropos classpath complete eldoc info inspect-start inspect-refresh inspect-pop inspect-push inspect-reset macroexpand ns-list ns-vars resource stacktrace toggle-trace-var toggle-trace-ns undef
Please, install (or update) cider-nrepl 0.8.2 and restart CIDER
user>
Run Code Online (Sandbox Code Playgroud)
不过,我有一个依赖于[cider/cider-nrepl "0.8.2"]我project.clj.当我跑步时,这工作正常,lein repl然后我可以从苹果酒中连接好:
; CIDER 0.8.2 (Java 1.7.0_51, Clojure 1.6.0, nREPL 0.2.6)
swedishchef.handler>
Run Code Online (Sandbox Code Playgroud)
我可以看到我从leiningen wrt得到了两个不同的消息.nREPL,取决于我如何开始:
[sugarcube->swedishchef]lein ring server
See https://github.com/technomancy/leiningen/wiki/Repeatability)
Started nREPL server …Run Code Online (Sandbox Code Playgroud) 当我尝试在使用Compojure模板创建的Clojure Webapp项目中使用POST方法时,得到了“ 无效的防伪令牌 ”。
我进行了研究,Ring中间件为来自其他站点的经过身份验证的请求创建了CSRF(跨站点请求表单)令牌(以使用已经登录并访问不允许访问的页面的其他人的凭据)。
这些令牌是默认的,我们需要在WebApp周围使用ring.middleware的wrap-params。无法到达任何地方。请帮忙 !!如何摆脱无效的防伪令牌。
我的handler.clj文件是:
(ns jsonparser-webapp.handler
(:require [compojure.core :refer :all]
[compojure.route :as route]
[jsonparser-webapp.views :as views])
(:use [ring.middleware.params :only [wrap-params]])
(defroutes app-routes
(GET "/"
[]
(views/home-page))
(GET "/goto"
[]
(views/goto))
(POST "/posted"
{params :params}
(views/posted params))
(route/not-found "Not Found"))
(def app
(wrap-params app-routes site-defaults))
Run Code Online (Sandbox Code Playgroud)
我的views.clj文件是
(ns jsonparser-webapp.views
(:require [hiccup.page :as hic-p]
[hiccup.form :as hf]))
(defn gen-page-head
[title]
[:head
[:title title]])
(defn home-page
[]
(hic-p/html5
(gen-page-head "Json Parser Home.")
[:h1 "Welcome."]
[:p "Json Web App."] …Run Code Online (Sandbox Code Playgroud) 任何人都可以解释为什么在下面的代码中,函数的名称在第一部分作为*(乘数)?
(defn bar
([a b] (bar a b 100))
([a b c] (* a b c)))
Run Code Online (Sandbox Code Playgroud)
给bar两个args (bar 2 3)产量(* 2 3 100)