tornado:构造一个分级路由 ##前言 在tornado中,并没有django那样NB的设计,很多东西要我们自己动手。比如django中司空见惯的分级路由。 ## 构建 ### url_routers.py 提供两个函数用来做处理,代码: ``` # coding: utf-8 from __future__ import unicode_literals from importlib import import_module def include(module): res = import_module(module) urls = getattr(res, 'urls') return urls def url_wrapper(urls): wrapper_list = [] for url in urls: path, handles = url if isinstance(handles, (tuple, list)): for handle in handles: pattern, handle_class = handle wrap = ('{0}{1}'.format(path, pattern), handle_class) wrapper_list.append(wrap) else: wrapper_list.append((path, handles)) print(wrapper_list) return wrapper_list ``` ###项目文件 controllers/test/urls.py ``` from __future__ import unicode_literals from index import IndexHandler, Reverse urls = [ (r'hello/(\w+)', IndexHandler), (r'reverse/(\w+)', Reverse), ] ``` controllers/test/index.py ``` import tornado.web class IndexHandler(tornado.web.RequestHandler): def get(self, name): greeting = self.get_argument('greeting', 'Hello') self.write(greeting + '{}, friendly user!'.format(name)) class Reverse(tornado.web.RequestHandler): def get(self, input_str): self.write(input_str[::-1]) ``` ###最后,run.py启动项目 在这个项目中,其实只是用两个函数巧妙的拆分了urls路由。让代码帮我们拼接所有的urls。 ``` # coding: utf-8 from __future__ import unicode_literals import tornado.httpserver import tornado.ioloop import tornado.web from url_router import include, url_wrapper from controllers.test_hello.index import IndexHandler from tornado.options import define, options define("port", default=8000, help="run on the given port", type=int) application = tornado.web.Application(url_wrapper([ (r"/(\w+)", IndexHandler), (r"/test/", include('controllers.test_hello.urls')), ])) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(application) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start() ``` 来自 大脸猪 写于 2017-04-21 19:21 -- 更新于2020-10-19 13:06 -- 1 条评论