Tornado #3 项目结构

Tornado的一些特性和使用技巧:

  • 控制器为类形式,http方法对应类方法。契合Restful,支持装饰器。
  • 所有控制器继承自 tornado.web.Application 的子类 tornado.web.RequestHandler,故控制器中可以获取到app实例中的信息。比如可以通过初始化tornado.web.Application时添加设置参数,再在控制器中使用self.settings[]获取。
  • 可以使所有控制器继承自一个自定义类,这个自定义类再继承自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}}

你可能感兴趣的:(Tornado #3 项目结构)