Tornado 基本路由使用

2022-03-09 09:32 更新

靈活的路由實(shí)現(xiàn)

Tornado 使用 ?Router類實(shí)現(xiàn)將 HTTP 請(qǐng)求路由到適當(dāng)?shù)奶幚沓绦颉?code>tornado.web.Application類是一個(gè)路由器實(shí)現(xiàn),可以直接使用,也可以使用此模塊中的類來增加靈活性。 ?RuleRouter類可以匹配比 ?Application更多的條件,或者可以對(duì) ?Router接口進(jìn)行子類化以實(shí)現(xiàn)最大程度的定制。

?Router接口擴(kuò)展了 ?HTTPServerConnectionDelegate以提供額外的路由功能。 這也意味著任何 Router 實(shí)現(xiàn)都可以直接用作 ?HTTPServer構(gòu)造函數(shù)的 ?request_callback?。

路由器子類必須實(shí)現(xiàn)一個(gè) ?find_handler方法來提供一個(gè)合適的 ?HTTPMessageDelegate實(shí)例來處理請(qǐng)求:

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實(shí)現(xiàn)的主要職責(zé)是提供從請(qǐng)求到處理該請(qǐng)求的 ?HTTPMessageDelegate實(shí)例的映射。 在上面的示例中,我們可以看到即使沒有實(shí)例化應(yīng)用程序也可以進(jìn)行路由。

為了路由到?RequestHandler?實(shí)現(xiàn),我們需要一個(gè)?Application?實(shí)例。 ?get_handler_delegate ?提供了一種方便的方法來為給定的請(qǐng)求和 ?RequestHandler創(chuàng)建 ?HTTPMessageDelegate。

這是一個(gè)簡(jiǎn)單的示例,說明我們?nèi)绾瓮ㄟ^ 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接口增加了區(qū)分路由并使用路由名稱和附加參數(shù)將它們反轉(zhuǎn)為原始 url 的能力。 ?Application本身是 ?ReversibleRouter?類的實(shí)現(xiàn)。

?RuleRouter和 ?ReversibleRuleRouter是 ?Router和 ?ReversibleRouter接口的實(shí)現(xiàn),可用于創(chuàng)建基于規(guī)則的路由配置。

Rules是?Rule?類的實(shí)例。 它們包含一個(gè) ?Matcher?,它提供了用于確定規(guī)則是否與特定請(qǐng)求和目標(biāo)匹配的邏輯,可以是以下之一:

1、?HTTPServerConnectionDelegate的一個(gè)實(shí)例:

router = RuleRouter([
    Rule(PathMatches("/handler"), ConnectionDelegate()),
    # ... more rules
])

class ConnectionDelegate(HTTPServerConnectionDelegate):
    def start_request(self, server_conn, request_conn):
        return MessageDelegate(request_conn)

2、接受 ?HTTPServerRequest類型的單個(gè)參數(shù)的可調(diào)用對(duì)象

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()

3、另一個(gè)?Router?實(shí)例:

router = RuleRouter([
    Rule(PathMatches("/router.*"), CustomRouter())
])

這其中當(dāng)然允許嵌套 RuleRouter 或 Application:

router = RuleRouter([
    Rule(HostMatches("example.com"), RuleRouter([
        Rule(PathMatches("/app1/.*"), Application([(r"/app1/handler", Handler)])),
    ]))
])

server = HTTPServer(router)

在下面的示例中RuleRouter用于在應(yīng)用程序之間進(jìn)行路由:

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)

class tornado.routing.Router

抽象路由器接口

find_handler(request: tornado.httputil.HTTPServerRequest, **kwargs) → Optional[tornado.httputil.HTTPMessageDelegate]

必須實(shí)現(xiàn)以返回可以為請(qǐng)求提供服務(wù)的適當(dāng)?shù)?nbsp;?HTTPMessageDelegate實(shí)例。 路由實(shí)現(xiàn)可能會(huì)傳遞額外的 kwargs 來擴(kuò)展路由邏輯。

參數(shù):

  • ?request(httputil.HTTPServerRequest) – 當(dāng)前的 HTTP 請(qǐng)求。
  • ?kwargs– 路由實(shí)現(xiàn)傳遞的附加關(guān)鍵字參數(shù)。

返回:

一個(gè)用于處理請(qǐng)求的 ?HTTPMessageDelegate實(shí)例。

class tornado.routing.ReversibleRouter

抽象路由器接口,用于路由器,可處理命名路由,并支持將其反轉(zhuǎn)為原始URL。

reverse_url(name: str, *args) → Optional[str]

返回給定路由名稱和參數(shù)的 url 字符串,如果未找到匹配項(xiàng),則返回 None。

參數(shù):

  • ?name(str) - 路由名稱。
  • ?args- 網(wǎng)址參數(shù)。

返回:

給定路由名稱(或無)的參數(shù)化 url 字符串。

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)

基于規(guī)則的路由器實(shí)現(xiàn)。

從規(guī)則的有序列表構(gòu)造一個(gè)路由器:

RuleRouter([
    Rule(PathMatches("/handler"), Target),
    # ... more rules
])

您還可以省略顯式Rule構(gòu)造函數(shù)并使用參數(shù)元組:

RuleRouter([
    (PathMatches("/handler"), Target),
])

?PathMatches是一個(gè)默認(rèn)匹配器,所以上面的例子可以簡(jiǎn)化:

RuleRouter([
    ("/handler", Target),
])

在上面的示例中,?Target可以是嵌套的 ?Router實(shí)例、?HTTPServerConnectionDelegate的實(shí)例或舊式可調(diào)用對(duì)象,并接受請(qǐng)求參數(shù)。

參數(shù): rules – ?Rule實(shí)例列表或 ?Rule構(gòu)造函數(shù)參數(shù)的元組。

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

將新規(guī)則附加到路由器。

參數(shù):rules – ?Rule實(shí)例列表(或參數(shù)元組,傳遞給 ?Rule構(gòu)造函數(shù))。

process_rule(rule: tornado.routing.Rule) → tornado.routing.Rule

覆蓋此方法以對(duì)每個(gè)規(guī)則進(jìn)行額外的預(yù)處理。

參數(shù):rule(?Rule?)——要處理的規(guī)則。

返回:相同或修改的規(guī)則實(shí)例。

get_target_delegate(target: Any, request: tornado.httputil.HTTPServerRequest, **target_params) → Optional[tornado.httputil.HTTPMessageDelegate]

返回規(guī)則目標(biāo)的 ?HTTPMessageDelegate實(shí)例。 此方法由 ?find_handler調(diào)用,并且可以擴(kuò)展以提供其他目標(biāo)類型。

參數(shù):

  • ?target?——Rule的目標(biāo)。
  • ?request ?(httputil.HTTPServerRequest) – 當(dāng)前請(qǐng)求。
  • ?target_params ?– 可用于創(chuàng)建 ?HTTPMessageDelegate的附加參數(shù)。

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)

實(shí)現(xiàn) ?reverse_url ?方法的基于規(guī)則的路由器。

添加到此路由器的每個(gè)規(guī)則都可能有一個(gè)名稱屬性,可用于重建原始 ?URI?。 實(shí)際的重建發(fā)生在規(guī)則的匹配器中

class tornado.routing.Rule(matcher: tornado.routing.Matcher, target: Any, target_kwargs: Optional[Dict[str, Any]] = None, name: Optional[str] = None)

路由規(guī)則。

構(gòu)造一個(gè) ?Rule ?實(shí)例。

參數(shù):

  • ?matcher ?(Matcher) – 一個(gè) Matcher 實(shí)例,用于確定是否應(yīng)將規(guī)則視為特定請(qǐng)求的匹配項(xiàng)。
  • ?target ?- Rule的目標(biāo)(通常是 ?RequestHandler ?或 ?HTTPServerConnectionDelegate ?子類,甚至是嵌套路由器,具體取決于路由實(shí)現(xiàn))。
  • ?target_kwargs ?(dict) – 在目標(biāo)實(shí)例化時(shí)可能有用的參數(shù)字典(例如,?RequestHandler子類的 ?status_code?)。 它們最終出現(xiàn)在 ?RuleRouter.get_target_delegate? 方法的 ?target_params['target_kwargs']? 中。
  • ?name ?(str) -- 可用于在 ?ReversibleRouter.reverse_url? 實(shí)現(xiàn)中找到它的規(guī)則的名稱。

class tornado.routing.Matcher

表示請(qǐng)求功能的匹配器

match(request: tornado.httputil.HTTPServerRequest) → Optional[Dict[str, Any]]

將當(dāng)前實(shí)例與請(qǐng)求匹配

參數(shù):?request(httputil.HTTPServerRequest) – 當(dāng)前的 HTTP 請(qǐng)求

返回:要傳遞給目標(biāo)處理程序的參數(shù)字典(例如,可以傳遞 ?handler_kwargs?、?path_args?、?path_kwargs以進(jìn)行正確的 ?RequestHandler實(shí)例化)。 空 dict 是一個(gè)有效的(和常見的)返回值,用于在不使用參數(shù)傳遞功能時(shí)指示匹配。 必須返回 None 以指示不匹配。

reverse(*args) → Optional[str]

從匹配器實(shí)例和附加參數(shù)重建完整的 url

class tornado.routing.AnyMatches

匹配任何請(qǐng)求

class tornado.routing.HostMatches(host_pattern: Union[str, Pattern[AnyStr]])

匹配來自 ?host_pattern正則表達(dá)式指定的主機(jī)的請(qǐng)求

class tornado.routing.DefaultHostMatches(application: Any, host_pattern: Pattern[AnyStr])

匹配來自等于應(yīng)用程序 default_host 的主機(jī)的請(qǐng)求。 如果存在 ?X-Real-Ip? 標(biāo)頭,則始終不返回匹配項(xiàng)。

class tornado.routing.PathMatches(path_pattern: Union[str, Pattern[AnyStr]])

將請(qǐng)求與 ?path_pattern ?正則表達(dá)式指定的路徑匹配。

class tornado.routing.URLSpec(pattern: Union[str, Pattern[AnyStr]], handler: Any, kwargs: Optional[Dict[str, Any]] = None, name: Optional[str] = None)

指定 URL 和處理程序之間的映射。

參數(shù):

  • ?pattern?:要匹配的正則表達(dá)式。 正則表達(dá)式中的任何捕獲組都將作為參數(shù)傳遞給處理程序的 get/post等方法(如果命名則按關(guān)鍵字,如果未命名則按位置。命名和未命名的捕獲組不能在同一規(guī)則中混合使用)。
  • ?handler?:要調(diào)用的 ?RequestHandler子類。
  • ?kwargs?(可選):要傳遞給處理程序構(gòu)造函數(shù)的附加參數(shù)字典。
  • ?name?(可選):此處理程序的名稱。由 ?reverse_url使用。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)