6

私はDjango/Pythonの経験が豊富ですが、ClojureのNoirフレームワークを使用してWebサイトをセットアップするのを手伝っています。Djangoでは、次のようなURLに慣れています。

http://site/some/url 

302-自動的ににリダイレクトされます

http://site/some/url/

ノワールはもっとうるさくて、これをしません。

これを自動的に行う適切な方法は何でしょうか?適切な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))))
4

2 に答える 2

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 "/")))))

指輪/口ひげの Web アプリでテストしたところ、かなりうまく機能しました。


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))))
于 2012-09-18T08:02:10.087 に答える
1

これは便利だと思いました:

(defpage "" []
  (response/redirect "/myapp/"))

/myapp -> /myapp/

于 2013-08-30T02:19:31.443 に答える