tornado.routing — 基本的なルーティング実装¶
柔軟なルーティング実装。
Tornado は、Router クラスの実装を使用して、HTTP リクエストを適切なハンドラーにルーティングします。 tornado.web.Application クラスは Router の実装であり、直接使用することも、このモジュールのクラスを使用して柔軟性を高めることもできます。 RuleRouter クラスは Application より多くの基準に一致させることができ、Router インターフェースをサブクラス化して最大限のカスタマイズを行うこともできます。
Router インターフェースは、HTTPServerConnectionDelegate を拡張して、追加のルーティング機能を提供します。これはまた、任意の Router 実装を HTTPServer コンストラクターの request_callback として直接使用できることを意味します。
Router のサブクラスは、リクエストを処理する適切な HTTPMessageDelegate インスタンスを提供するために、find_handler メソッドを実装する必要があります。
class CustomRouter(Router):
def find_handler(self, request, **kwargs):
# some routing logic providing a suitable HTTPMessageDelegate instance
return MessageDelegate(request.connection)
class MessageDelegate(HTTPMessageDelegate):
def __init__(self, connection):
self.connection = connection
def finish(self):
self.connection.write_headers(
ResponseStartLine("HTTP/1.1", 200, "OK"),
HTTPHeaders({"Content-Length": "2"}),
b"OK")
self.connection.finish()
router = CustomRouter()
server = HTTPServer(router)
Router 実装の主な役割は、リクエストから、そのリクエストを処理する HTTPMessageDelegate インスタンスへのマッピングを提供することです。上記の例では、Application をインスタンス化しなくてもルーティングが可能であることがわかります。
RequestHandler の実装へのルーティングには、Application インスタンスが必要です。get_handler_delegate は、特定のリクエストと RequestHandler に対して HTTPMessageDelegate を作成するための便利な方法を提供します。
HTTP メソッドによって RequestHandler のサブクラスにルーティングする方法の簡単な例を以下に示します。
resources = {}
class GetResource(RequestHandler):
def get(self, path):
if path not in resources:
raise HTTPError(404)
self.finish(resources[path])
class PostResource(RequestHandler):
def post(self, path):
resources[path] = self.request.body
class HTTPMethodRouter(Router):
def __init__(self, app):
self.app = app
def find_handler(self, request, **kwargs):
handler = GetResource if request.method == "GET" else PostResource
return self.app.get_handler_delegate(request, handler, path_args=[request.path])
router = HTTPMethodRouter(Application())
server = HTTPServer(router)
ReversibleRouter インターフェースは、ルートを区別し、ルートの名前と追加の引数を使用して元の URL に逆変換する機能を追加します。Application 自体は ReversibleRouter クラスの実装です。
RuleRouter と ReversibleRuleRouter は、Router と ReversibleRouter インターフェースの実装であり、ルールベースのルーティング構成の作成に使用できます。
ルールは Rule クラスのインスタンスです。これには、特定のリクエストとターゲットに対するルールのマッチングを決定するロジックを提供する Matcher と、以下のいずれかになることができるターゲットが含まれています。
HTTPServerConnectionDelegateのインスタンス
router = RuleRouter([
Rule(PathMatches("/handler"), ConnectionDelegate()),
# ... more rules
])
class ConnectionDelegate(HTTPServerConnectionDelegate):
def start_request(self, server_conn, request_conn):
return MessageDelegate(request_conn)
HTTPServerRequest型の単一の引数を受け入れる呼び出し可能オブジェクト
router = RuleRouter([
Rule(PathMatches("/callable"), request_callable)
])
def request_callable(request):
request.write(b"HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK")
request.finish()
別の
Routerインスタンス
router = RuleRouter([
Rule(PathMatches("/router.*"), CustomRouter())
])
もちろん、ネストされた RuleRouter または Application が許可されます。
router = RuleRouter([
Rule(HostMatches("example.com"), RuleRouter([
Rule(PathMatches("/app1/.*"), Application([(r"/app1/handler", Handler)])),
]))
])
server = HTTPServer(router)
以下の例では、RuleRouter を使用してアプリケーション間をルーティングしています。
app1 = Application([
(r"/app1/handler", Handler1),
# other handlers ...
])
app2 = Application([
(r"/app2/handler", Handler2),
# other handlers ...
])
router = RuleRouter([
Rule(PathMatches("/app1.*"), app1),
Rule(PathMatches("/app2.*"), app2)
])
server = HTTPServer(router)
アプリケーションレベルのルーティングの詳細については、Application のドキュメントを参照してください。
バージョン 4.5 で追加されました。
- class tornado.routing.Router[source]¶
抽象的なルーターインターフェース。
- find_handler(request: HTTPServerRequest, **kwargs: Any) Optional[HTTPMessageDelegate][source]¶
リクエストを処理できる
HTTPMessageDelegateの適切なインスタンスを返すために実装する必要があります。ルーティングの実装では、追加の kwargs を渡してルーティングロジックを拡張できます。- パラメータ
request (httputil.HTTPServerRequest) – 現在の HTTP リクエスト。
kwargs – ルーティングの実装によって渡される追加のキーワード引数。
- 戻り値
リクエストの処理に使用される
HTTPMessageDelegateのインスタンス。
- class tornado.routing.RuleRouter(rules: Optional[List[Union[Rule, List[Any], Tuple[Union[str, Matcher], Any], Tuple[Union[str, Matcher], Any, Dict[str, Any]], Tuple[Union[str, Matcher], Any, Dict[str, Any], str]]]] = None)[source]¶
ルールベースのルーター実装。
ルールの順序付きリストからルーターを構築します。
RuleRouter([ Rule(PathMatches("/handler"), Target), # ... more rules ])
明示的な
Ruleコンストラクタを省略し、引数のタプルを使用することもできます。RuleRouter([ (PathMatches("/handler"), Target), ])
PathMatchesはデフォルトのマッチャーなので、上記の例は簡略化できます。RuleRouter([ ("/handler", Target), ])
上記の例では、
TargetはネストされたRouterインスタンス、HTTPServerConnectionDelegateのインスタンス、またはリクエスト引数を受け取る旧式の呼び出し可能オブジェクトです。- add_rules(rules: List[Union[Rule, List[Any], Tuple[Union[str, Matcher], Any], Tuple[Union[str, Matcher], Any, Dict[str, Any]], Tuple[Union[str, Matcher], Any, Dict[str, Any], str]]]) None[source]¶
ルーターに新しいルールを追加します。
- パラメータ
rules – Ruleインスタンスのリスト(または、Ruleコンストラクタに渡される引数のタプル)。
- process_rule(rule: Rule) Rule[source]¶
各ルールの追加の前処理のために、このメソッドをオーバーライドします。
- パラメータ
rule (Rule) – 処理されるルール。
- 戻り値
同じ、または変更されたRuleインスタンス。
- get_target_delegate(target: Any, request: HTTPServerRequest, **target_params: Any) Optional[HTTPMessageDelegate][source]¶
HTTPMessageDelegateのインスタンスをルールのターゲットに対して返します。このメソッドはfind_handlerによって呼び出され、追加のターゲットタイプを提供するために拡張できます。- パラメータ
target – ルールのターゲット。
request (httputil.HTTPServerRequest) – 現在のリクエスト。
target_params –
HTTPMessageDelegateの作成に役立つ追加のパラメータ。
- class tornado.routing.ReversibleRuleRouter(rules: Optional[List[Union[Rule, List[Any], Tuple[Union[str, Matcher], Any], Tuple[Union[str, Matcher], Any, Dict[str, Any]], Tuple[Union[str, Matcher], Any, Dict[str, Any], str]]]] = None)[source]¶
`reverse_url` メソッドを実装するルールベースのルーターです。
このルーターに追加された各ルールには、元のURIを再構築するために使用できる `name` 属性があります。実際の再構築は、ルールのマッチャーで行われます(
Matcher.reverseを参照)。
- class tornado.routing.Rule(matcher: Matcher, target: Any, target_kwargs: Optional[Dict[str, Any]] = None, name: Optional[str] = None)[source]¶
ルーティングルールです。
Ruleインスタンスを構築します。
- パラメータ
**matcher** (Matcher) – 特定のリクエストに対してルールが一致とみなされるべきかどうかを判断するために使用される
Matcherインスタンス。**target** – ルールのターゲット(通常は
RequestHandlerまたはHTTPServerConnectionDelegateのサブクラス、あるいはルーティング実装に応じてネストされたRouter)。**target_kwargs** (dict) – ターゲットのインスタンス化時に役立つ可能性のあるパラメーターの辞書(例:
RequestHandlerサブクラスのstatus_code)。これらはRuleRouter.get_target_delegateメソッドのtarget_params['target_kwargs']に格納されます。**name** (str) –
ReversibleRouter.reverse_urlの実装でルールを見つけるために使用できるルールの名前。
- class tornado.routing.Matcher[source]¶
リクエストの機能に対するマッチャーを表します。
- match(request: HTTPServerRequest) Optional[Dict[str, Any]][source]¶
現在のインスタンスをリクエストと照合します。
- パラメータ
request (httputil.HTTPServerRequest) – 現在のHTTPリクエスト
- 戻り値
ターゲットハンドラに渡されるパラメータの辞書(例:
handler_kwargs、path_args、path_kwargsは、適切なRequestHandlerのインスタンス化のために渡すことができます)。引数渡し機能を使用しない場合は、一致を示す有効な(そして一般的な)戻り値として空の辞書が使用できます。Noneは一致しないことを示すために返される必要があります。
- class tornado.routing.HostMatches(host_pattern: Union[str, Pattern])[source]¶
host_pattern正規表現で指定されたホストからのリクエストにマッチします。
- class tornado.routing.DefaultHostMatches(application: Any, host_pattern: Pattern)[source]¶
アプリケーションのdefault_hostと等しいホストからのリクエストにマッチします。
X-Real-Ipヘッダが存在する場合は、常にマッチしません。
- class tornado.routing.PathMatches(path_pattern: Union[str, Pattern])[source]¶
path_pattern正規表現で指定されたパスを持つリクエストにマッチします。
- class tornado.routing.URLSpec(pattern: Union[str, Pattern], handler: Any, kwargs: Optional[Dict[str, Any]] = None, name: Optional[str] = None)[source]¶
URLとハンドラのマッピングを指定します。
パラメータ
pattern: 照合する正規表現。正規表現内のキャプチャグループは、引数としてハンドラのget/postなどのメソッドに渡されます(名前付きの場合はキーワードで、名前なしの場合は位置で。名前付きと名前なしのキャプチャグループを同じルールで混在させることはできません)。handler: 呼び出されるRequestHandlerサブクラス。kwargs(オプション): ハンドラのコンストラクタに追加で渡される引数の辞書。name(オプション): このハンドラの名前。reverse_urlで使用されます。