2017-12-25 27 views
0

私は、ルーティング実装で竜巻4.5.2を使用します。 私のサーバーには2つのバージョンのAPIがあり、basefancyを呼び出します。だから、クライアントはそれらの両方を使用することができます:"基本"ハンドラへの竜巻のルーティング

GET /base/foo 
GET /base/baz 

GET /fancy/foo 
GET /fancy/baz 

しかし、いくつかのfancyハンドラが実装されないことがあります。この場合はbaseを使用する必要があります。例では

application = web.Application([ 
    (r"/base/foo", handlers.BaseFooHandler, {"some": "settings"}), 
    (r"/base/baz", handlers.BaseBazHandler, {"some": "settings"}), 
    (r"/fancy/foo", handlers.FancyFooHandler, {"some": "settings"}), 
]) 

cilentが仕事を行う必要がありGET /fancy/bazBaseBazHandlerを要求します。

どのように私は竜巻のルーティングでそれを達成することができますか?

答えて

0

デコレータを使用して経路を登録しているので、一致しない/登録されていないすべての経路に対応するカスタムルータを作成できます。/fancy/.*これが正しく機能するためには、ルータを最後にに登録する必要があります。

この方法では、/fancy/...ルートが登録されていない場合にのみ、カスタムルータが照合されます。つまり、カスタムルータクラスでこれらの処理を行う必要があることを意味します。

  1. フォールバックBaseBazHandlerが存在するかどうかを確認します。
  2. 存在する場合は、要求をその要求に転送します。
  3. それ以外の場合は、404エラーを返します。

さらに、任意に進む前に、あなたは404のリクエストを処理するためのカスタムクラスを作成する必要があります。これは、ハンドラが見つからない場合、404エラーを返す最も簡単な方法であるため、必要です。

:カスタムルーターを登録することができ、あなたが他のすべてのルートを追加した後、最後に

from tornado.routing import Router 

class MyRouter(Router): 
    def __init__(self, app): 
     self.app = app 

    def find_handler(self, request, **kwargs): 
     endpoint = request.path.split('/')[2] # last part of the path 

     fallback_handler = 'Base%sHandler' % endpoint.title() 
     # fallback_handler will look like this - 'BaseBazHandler' 

     # now check if the handler exists in the current file 
     try: 
      handler = globals()[fallback_handler] 
     except KeyError: 
      handler = Handle404 

     return self.app.get_handler_delegate(request, handler) 

class Handle404(RequestHandler): 
    def get(self): 
     self.set_status(404) 
     self.write('404 Not Found') 

さて、今のは、カスタムルーターを書いてみましょう

from tornado.routing import PathMatches 

application.add_handlers(r'.*', # listen for all hosts 
    [ 
     (PathMatches(r"/fancy/.*"), MyRouter(application)), 
    ] 
) 

MyRouter.find_handlerを指摘し、現在のモジュール(ファイル)内のハンドラのチェックチェックのみを指摘します。必要に応じて、異なるモジュールでハンドラを検索するようにコードを変更します。

+0

確かに私はハンドラをクラスデコレータで自動的に追加しますが、対応するハンドラがない場合は追加のエントリポイントを追加するハッカーを作成したくありません –

+0

@SergeyBelashこんにちは、私は答えを更新しました。見てみましょう。 – xyres

関連する問題