2012-04-23 9 views
1

trailing_slashツールを動作させることができません。私は と一緒に遊んだことがあります。trailing_slashツールのオプションは何も効果がないようです。 私はCherryPy 3.2.2とルート1.13を使用しています。私は 末尾にスラッシュを追加したいと思います。デバッグ出力にエラーはありません。CherryPy 3.2の後続のスラッシュツールに後続のスラッシュを追加しない

私は127.0.0.1:8080/blog/に行っても動作しますが、もし私が から127.0.0.1:8080/blogに行けば、それは動作しません。

私の設定は次のとおりです。

そして例のルートがある:

routes = [["blog_index", "/blog/", {'controller': BlogController(), 'action': 'index','entry_id': 'index'}],] 

誰も私が間違っているのかを見ることができますか? 必須ドキュメントの不具合や不足はありますか? trailing_slashツールはRoutes Dispatcherで動作しますか?

フルSRC:https://bitbucket.org/ddevine/icdy/src

答えて

1

最後のスラッシュツールは、ルートのディスパッチャでは動作しません。後続のスラッシュツールでは、どのディスパッチャが選択されても、cherrypy.request.is_indexはTrueまたはFalseに設定され、RoutesDispatcherクラスはまったく動作しないように見えます。したがって、is_indexはNoneに残り、後続のスラッシュツールは何も行いません。ルートの知識のある人は、CherryPyのコードベースでそれを修正したり、is_indexを設定する独自のディスパッチャを作成したり、事実の後にis_indexを修正する別のツールを作成したりすることができます。

+0

をこれは残念なことです。私はカスタムディスパッチャーを書くように見えます。うまくいけば、私はそうしようとすると、もっと文書化されていないグッズを見つけることはできません。 –

+0

私はコードを調べました。結果が==無しの場合 の場合: result = self.mapper.match(path_info + "/") ' これはうまくいくようですが、私がまだ気付いていない理由のためにするのは非常にばかげたことかもしれません。 –

+0

@DanielDevineあなたはおそらくそれをやりたいとは思わないでしょう。なぜなら、後ろにスラッシュを付けたパスと、後にスラッシュを付けていないパスは、ルートで非常に異なることができるからです。正確さを確保したいのであれば、それは良い考えではありません。リバースプロキシWebサーバーを構成して、どこにでもスラッシュを追加することをお勧めします。 –

0

同じパスの2つの接続を定義することができるため、ルートに「インデックス」という概念はありません。後者はスラッシュとなしの2つの接続を定義し、2つの全く異なるコントローラやアクションに接続します。実生活ではこれをしませんが、ルートでは可能ですので、これに対処するtrailing_slashツールを変更するのは良い方法ではありません。

IMHOでは、trailing_slashツールが少し欠けていて、現在InternalRedirectミドルウェアがCherryPyでやっているように、デフォルトのWSGI中間パイプラインの前にあるWSGIミドルウェアのレベルに上昇するはずです。たとえば、script_nameの下にRouteDispatcherをマウントした場合、Routinesのすべてのルートがスラッシュで始まる必要があるため、trailing_slashツールにscript_nameの後にCPを付けることはできません。 RoutesException - 一致するときにpath_infoが空の文字列である場合。

0

長い時間が尋ねたが、ここではそれを動作させるための方法です:

def index(index=True): 
    cherrypy.request.is_index = index 
cherrypy.tools.index = cherrypy.Tool('on_start_resource', index) 

config = { 
    ... 
     'tools.trailing_slash.status': 307, 
     'tools.index.on': True, 
    ... 
} 
関連する問題