python
  • regex
  • webapp2
  • 2012-03-04 4 views 2 likes 
    2

    私はこのような問題があります。クラスの1つのメソッドが(URI "/ solution/add"と "solution/edit"の)異なるURIを扱うようにします。だから私はそのようなルーティングを書いた:webapp2:ルーティングの正規表現

    app = webapp2.WSGIApplication([webapp2.Route(r'/solutions/(add|edit)', handler='solution.SolutionPage:add_edit_solution'), ], debug=True) 
    

    そして、webapp2は404エラーを出します。この問題の解決策をお聞かせください。

    勿論私はすべてのURIのための異なる経路を書き込むことができますが、それはとても興味深いものではありません。)

    答えて

    5

    webapp2 docsは、あなたが名前と表現を分離するコロンで、角括弧内の正規表現を配置する必要があり、指示通り。名前は任意ですが、このような

    everything outside of <> is not interpreted as a regular expression to be matched

    だから、何か:'/blog/<:\d{4}>/<:\d{2}>'または、あなたのケースでは、この:

    webapp2.Route(r'/solutions/<:(add|edit)>', 
           handler='solution.SolutionPage:add_edit_solution') 
    
    +0

    エラー: TypeError:add_edit_solution()は、1つの引数(2が指定されています)をとります。 このエラーは、この式が引数(「product_id」など)を取得するためであると考えられます。 – Dimitry

    +0

    @Dimitry、正しい。どうしたの?正規表現を 'Route'に渡すと、それは定位置の引数として正規表現のグループを持つハンドラを呼び出すか、名前を与えた場合はキーワード引数としてハンドラを呼び出します。 "[定義されている場合は名前](http://webapp-improved.appspot.com/guide/routing.html#the-url-template)は、ルートのURLを作成するために使用され、設定されている場合は、一致した正規表現のうちの1つは、キーワード引数としてハンドラに渡されます。それ以外の場合は、位置引数として渡されます。だからここで正規表現を使いたいなら、* argsか** kwargsを受け入れるハンドラを渡さなければなりません。期間。 – senderle

    +0

    まあ、ええ)それは動作します。ありがとうございました。最初はこれを実装する方法が異なると思っていましたが、引数なしで実装したかったのですが、引数を使用する方が良い方法です。 – Dimitry

    0

    私は何かを追加することができます。 私自身の目的のために、少し似たような操作を行うハンドラを作成しようとしましたが、重要な点は引数の代わりにself.request.hostまたはself.request.routeを使用したことです。

    これを実行し、結果をスイッチケースまたは/ elif/elseループで解析すると、URIHandlerという名前のクラスを作成できます。このクラスは、あらゆる種類の要求を正しいリソース(404/500/yyyエラーページ)を動的に再書き込みするか、新しいリソースごとにルートを追加する必要がありません。

    私は、2つの方法を比較してベンチに少し興味を持っていきたいと思います。

    関連する問題