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()
原文地址:https://www.cnblogs.com/liuer-mihou/p/11963639.html