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
で使用されます。