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)
抽象路由器接口
必須實現(xiàn)以返回可以為請求提供服務(wù)的適當?shù)?nbsp;?HTTPMessageDelegate
實例。 路由實現(xiàn)可能會傳遞額外的 kwargs 來擴展路由邏輯。
參數(shù):
request
(httputil.HTTPServerRequest) – 當前的 HTTP 請求。kwargs
– 路由實現(xiàn)傳遞的附加關(guān)鍵字參數(shù)。返回:
一個用于處理請求的 ?HTTPMessageDelegate
實例。
抽象路由器接口,用于路由器,可處理命名路由,并支持將其反轉(zhuǎn)為原始URL。
返回給定路由名稱和參數(shù)的 url 字符串,如果未找到匹配項,則返回 None。
參數(shù):
name
(str) - 路由名稱。args
- 網(wǎng)址參數(shù)。返回:
給定路由名稱(或無)的參數(shù)化 url 字符串。
基于規(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ù)的元組。
將新規(guī)則附加到路由器。
參數(shù):rules – ?Rule
實例列表(或參數(shù)元組,傳遞給 ?Rule
構(gòu)造函數(shù))。
覆蓋此方法以對每個規(guī)則進行額外的預處理。
參數(shù):rule(?Rule
?)——要處理的規(guī)則。
返回:相同或修改的規(guī)則實例。
返回規(guī)則目標的 ?HTTPMessageDelegate
實例。 此方法由 ?find_handler
調(diào)用,并且可以擴展以提供其他目標類型。
參數(shù):
target
?——Rule的目標。request
?(httputil.HTTPServerRequest) – 當前請求。target_params
?– 可用于創(chuàng)建 ?HTTPMessageDelegate
的附加參數(shù)。實現(xiàn) ?reverse_url
?方法的基于規(guī)則的路由器。
添加到此路由器的每個規(guī)則都可能有一個名稱屬性,可用于重建原始 ?URI
?。 實際的重建發(fā)生在規(guī)則的匹配器中
路由規(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ī)則的名稱。表示請求功能的匹配器
將當前實例與請求匹配
參數(shù):?request
(httputil.HTTPServerRequest) – 當前的 HTTP 請求
返回:要傳遞給目標處理程序的參數(shù)字典(例如,可以傳遞 ?handler_kwargs
?、?path_args
?、?path_kwargs
以進行正確的 ?RequestHandler
實例化)。 空 dict 是一個有效的(和常見的)返回值,用于在不使用參數(shù)傳遞功能時指示匹配。 必須返回 None 以指示不匹配。
從匹配器實例和附加參數(shù)重建完整的 url
匹配任何請求
匹配來自 ?host_pattern
正則表達式指定的主機的請求
匹配來自等于應(yīng)用程序 default_host 的主機的請求。 如果存在 ?X-Real-Ip
? 標頭,則始終不返回匹配項。
將請求與 ?path_pattern
?正則表達式指定的路徑匹配。
指定 URL 和處理程序之間的映射。
參數(shù):
pattern
?:要匹配的正則表達式。 正則表達式中的任何捕獲組都將作為參數(shù)傳遞給處理程序的 get/post等方法(如果命名則按關(guān)鍵字,如果未命名則按位置。命名和未命名的捕獲組不能在同一規(guī)則中混合使用)。handler
?:要調(diào)用的 ?RequestHandler
子類。kwargs
?(可選):要傳遞給處理程序構(gòu)造函數(shù)的附加參數(shù)字典。name
?(可選):此處理程序的名稱。由 ?reverse_url
使用。
更多建議: