如何使用Noir Web框架进行HTTP 302重定向

Joh*_*hnJ 6 http clojure noir

我正在帮助建立一个使用Clojure的Noir框架的网站,尽管我对Django/Python有更多的经验.在Django中,我习惯于使用URL等

http://site/some/url 
Run Code Online (Sandbox Code Playgroud)

被302重定向到自动化

http://site/some/url/
Run Code Online (Sandbox Code Playgroud)

黑色更挑剔,不会这样做.

什么是自动执行此操作的正确方法?由于良好的URL是解决网站的重要方式,许多用户会忘记尾随斜杠,这是我想添加到我的网站的基本功能.

编辑:基于@ IvanKoblik的建议,以下是最终为我工作的内容:

(defn wrap-slash [handler]
  (fn [{:keys [uri] :as req}]
    (if (and (.endsWith uri "/") (not= uri "/"))
      (handler (assoc req :uri (.substring uri
                                0 (dec (count uri)))))
      (handler req))))
Run Code Online (Sandbox Code Playgroud)

Iva*_*lik 2

我认为这可以通过自定义中间件实现。noir/server 具有公共功能add-middleware

这是 webnoir 的一个页面,解释了如何做到这一点。

从源代码来看,这个自定义中间件是首先执行的,因此您将在会话、cookie、url 参数等方面依赖您自己。


我编写了一个非常愚蠢的中间件包装器版本,它检查请求 URI 是否以斜杠结尾,如果不是,则重定向到末尾带有斜杠的 URI:

(use [ring.util.response :only [redirect]])

(defn wrap-slash [handler]
  (fn [{:keys [uri] :as req}]
    (if (.endsWith uri "/")
      (handler req)
      (redirect
       (str uri "/")))))
Run Code Online (Sandbox Code Playgroud)

我在我的环/胡子网络应用程序上对其进行了测试,效果相当不错。


EDIT1(在您回复我的评论后扩展我的答案。)

您可以使用自定义中间件来添加或删除 URL 的尾部斜杠。只需执行以下操作即可去掉尾部斜杠:

(use [ring.util.response :only [redirect]])

(defn add-slash [handler]
  (fn [{:keys [uri] :as req}]
    (if (.endsWith uri "/")
      (handler (assoc req 
                      :uri (.substring uri 
                                       0 (dec (count uri)))))
      (handler req))))
Run Code Online (Sandbox Code Playgroud)