Tornado的一些特性和使用技巧:
- 控制器为类形式,http方法对应类方法。契合Restful,支持装饰器。
- 所有控制器继承自 tornado.web.Application 的子类 tornado.web.RequestHandler,故控制器中可以获取到app实例中的信息。比如可以通过初始化tornado.web.Application时添加设置参数,再在控制器中使用self.settings[<set_name>]获取。
- 可以使所有控制器继承自一个自定义类,这个自定义类再继承自tornado.web.RequestHandler。如此可在自定义类修改控制器继承的属性。
下面是一种可行的结构:
app/
-- lib/
-- -- __init__.py
-- -- myRequestHandlers.py
-- handlers/
-- -- main.py
-- templates/
-- -- main.html
-- routes.py
-- __init__.py
app/lib/init.py
from .myRequestHandler import MyRequestHandler
app/lib/myRequestHandler.py
import json
import tornado.web
from bson import ObjectId
class JSONEncoder(json.JSONEncoder):
'用于格式化mongo取出数据中的ObjectId对象'
def default(self, o):
if isinstance(o, ObjectId):
return str(o)
return json.JSONEncoder.default(self, o)
class MyRequestHandler(tornado.web.RequestHandler):
def resp(self, code=None, msg=None, desc=None, ext_data=None):
"""返回值格式整理,所有/api/的数据接口,都应该采用此函数处理返回值"""
resp_dict = {}
resp_dict['RetSucceed'] = True
resp_dict['Succeed'] = code == 200 or not code
if code is None:
resp_dict['Code'] = code = 200
else:
resp_dict['Code'] = code
if msg is None:
resp_dict['Message'] = {}
else:
resp_dict['Message'] = msg
if desc is None:
resp_dict['Desc'] = ''
else:
resp_dict['Desc'] = desc
if ext_data is None:
resp_dict['extData'] = ''
else:
resp_dict['extData'] = ext_data
json_str = json.dumps(resp_dict, ensure_ascii=False, cls=JSONEncoder)
return self.write(json_str)
app/init.py
import platform
import tornado.ioloop
import tornado.web
import tornado.httpserver
from app.routes import routes
def make_app():
return tornado.web.Application(routes)
if __name__ == "__main__":
app = make_app()
server = tornado.httpserver.HTTPServer(app)
server.bind(8888)
if platform.system().lower() == 'windows':
server.start()
else:
server.start(0)
print('Tornado app running')
tornado.ioloop.IOLoop.current().start()
app/routes.py
from .handlers.main import MainHandler
routes = [
(r"/", MainHandler)
]
app/handlers/main.py
from app.lib import MyRequestHandler
class MainHandler(MyRequestHandler):
async def get(self):
self.render('../templates/main.html', index_word='Hello Tornado')
app/templates/main.html
{{index_word}}
网友评论