在tornado中,并没有django那样NB的设计,很多东西要我们自己动手。比如django中司空见惯的分级路由。
提供两个函数用来做处理,代码:
# 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])
在这个项目中,其实只是用两个函数巧妙的拆分了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()