Tornado 基本路由使用

2022-03-09 09:32 更新

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

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

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

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

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

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

這是一個簡單的示例,說明我們?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?類的實現(xiàn)。

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

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

1、?HTTPServerConnectionDelegate的一個實例:

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類型的單個參數(shù)的可調(diào)用對象

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、另一個?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用于在應(yīng)用程序之間進行路由:

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]

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

參數(shù):

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

返回:

一個用于處理請求的 ?HTTPMessageDelegate實例。

class tornado.routing.ReversibleRouter

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

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

返回給定路由名稱和參數(shù)的 url 字符串,如果未找到匹配項,則返回 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ī)則的路由器實現(xiàn)。

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

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

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

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

?PathMatches是一個默認匹配器,所以上面的例子可以簡化:

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

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

參數(shù): rules – ?Rule實例列表或 ?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ù)元組,傳遞給 ?Rule構(gòu)造函數(shù))。

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

覆蓋此方法以對每個規(guī)則進行額外的預處理。

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

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

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

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

參數(shù):

  • ?target?——Rule的目標。
  • ?request ?(httputil.HTTPServerRequest) – 當前請求。
  • ?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)

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

添加到此路由器的每個規(guī)則都可能有一個名稱屬性,可用于重建原始 ?URI?。 實際的重建發(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)造一個 ?Rule ?實例。

參數(shù):

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

class tornado.routing.Matcher

表示請求功能的匹配器

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

將當前實例與請求匹配

參數(shù):?request(httputil.HTTPServerRequest) – 當前的 HTTP 請求

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

reverse(*args) → Optional[str]

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

class tornado.routing.AnyMatches

匹配任何請求

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

匹配來自 ?host_pattern正則表達式指定的主機的請求

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

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

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

將請求與 ?path_pattern ?正則表達式指定的路徑匹配。

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

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

參數(shù):

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號