美文网首页
Tornado #3 项目结构

Tornado #3 项目结构

作者: 平仄_pingze | 来源:发表于2018-06-11 10:20 被阅读60次

    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}}
    

    相关文章

      网友评论

          本文标题:Tornado #3 项目结构

          本文链接:https://www.haomeiwen.com/subject/cymceftx.html