tornado的路由分发
1
from tornado.httpserver import HTTPServer from tornado.httputil import HTTPServerConnectionDelegate, HTTPMessageDelegate, ResponseStartLine, HTTPHeaders from tornado.routing import RuleRouter, Rule, PathMatches from tornado.web import RequestHandler, Application from tornado.ioloop import IOLoop ''' RuleRouter([Rule的实例1,Rule的实例2]) ''' ''' 第一种 Rule(Matcher,HTTPServerConnectionDelegate) ''' class MessageDelegate(HTTPMessageDelegate): def __init__(self, connection): self.connection = connection def finish(self): self.connection.write_headers( ResponseStartLine("HTTP/1.1", 200, "OK"), # HTTP响应的状态行 HTTPHeaders({"Content-Length": "2", "k": 'V'}), # Response Headers 响应头部 b"OK") # 响应body self.connection.finish() class ConnectionDelegate(HTTPServerConnectionDelegate): def start_request(self, server_conn, request_conn): print(server_conn, request_conn) return MessageDelegate(request_conn) router = RuleRouter([ Rule(PathMatches("/handler"), ConnectionDelegate()), # ... more rules ]) if __name__ == '__main__': server = HTTPServer(router) server.listen(8888) IOLoop.current().start()
from tornado.httpserver import HTTPServer from tornado.httputil import HTTPServerConnectionDelegate, HTTPMessageDelegate, ResponseStartLine, HTTPHeaders, \ HTTPServerRequest from tornado.routing import RuleRouter, Rule, PathMatches, Router from tornado.web import RequestHandler, Application from tornado.ioloop import IOLoop import tornado.template ''' RuleRouter([Rule的实例1,Rule的实例2]) ''' ''' 第二种 Rule(Matcher,Router实例) Router实例本质还是提供一个 HTTPMessageDelegate去处理 ''' 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() class CustomRouter(Router): def find_handler(self, request, **kwargs): # some routing logic providing a suitable HTTPMessageDelegate instance print(type(request)) # HTTPServerRequest print(request.connection) return MessageDelegate(request.connection) router = RuleRouter([ Rule(PathMatches("/router.*"), CustomRouter()) ]) if __name__ == '__main__': server = HTTPServer(router) server.listen(8888) IOLoop.current().start()
路由分发APP
from tornado.httpserver import HTTPServer from tornado.routing import RuleRouter, Rule, PathMatches, Router from tornado.web import RequestHandler, Application from tornado.ioloop import IOLoop class Handler1(RequestHandler): def get(self): self.write('1') class Handler2(RequestHandler): def get(self): self.write('2') 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) ]) if __name__ == '__main__': server = HTTPServer(router) server.listen(8888) IOLoop.current().start()
根据域名匹配
from tornado.httpserver import HTTPServer from tornado.routing import RuleRouter, Rule, PathMatches, Router, HostMatches from tornado.web import RequestHandler, Application from tornado.ioloop import IOLoop class Handler1(RequestHandler): def get(self): self.write('1') router = RuleRouter([ Rule(HostMatches('monitor.com'), RuleRouter([Rule(PathMatches('/app1.*'), Application([(r'/app1/handler1', Handler1)]))])), Rule(HostMatches('test.monitor.com'), RuleRouter([Rule(PathMatches('/app1.*'), Application([(r'/app1/handler1', Handler1)]))])), ]) if __name__ == '__main__': server = HTTPServer(router) server.listen(8888) IOLoop.current().start()

浙公网安备 33010602011771号