• 初识tornado


     Tornado 

    参考:  http://www.cnblogs.com/wupeiqi/articles/5702910.html

        Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。 开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。

    快速上手(比django简化的多)

    import tornado.ioloop
    import tornado.web
      
      
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("Hello, world")
      
    application = tornado.web.Application([
        (r"/index", MainHandler),
    ])
      
      
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    第一步:执行脚本,监听 8888 端口

    第二步:浏览器客户端访问 /index  -->  http://127.0.0.1:8888/index

    第三步:服务器接受请求,并交由对应的类处理该请求

    第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法

    第五步:方法返回值的字符串内容发送浏览器

    上面是最简单的用法,但实际中我们的程序比较复杂,所以需要对目录进行分类。

    commons 存放配置文件

    controler 存放 类 文件

    static 存放静态文件

    templates 存放html文件

    app.py 是主文件

    下面看看各文件内容:

    settings:

    settings = {
        'template_path': 'templates',
        'static': 'static'
    }
    

    home.py

    import tornado.web
    
    user_info = []
    
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            # self.write("Hello, world")
            self.render('index.html', user_info_list = user_info)
    
        def post(self, *args, **kwargs):
            user = self.get_argument('user')
            pwd = self.get_argument('pwd')
            user_info.append({'user': user, 'pwd': pwd})
            self.redirect('/index')
    

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>你好</h1>
        <form action="/index" method="post">
            <input type="text" name="user">
            <input type="text" name="pwd">
            <input type="submit" value="提交">
        </form>
        <ul>
            {% for item in user_info_list %}
            <li>{{item.get('user')}}-{{item['pwd']}}</li>
            {% end %}
        </ul>
    </body>
    </html>
    

      注意:tornado的模版语言更像是纯python的,和django不一样。

    app.py

    from tornado import ioloop
    import tornado.web
    from controler.home import MainHandler
    from commons.settings import settings
    
    
    application = tornado.web.Application([
        (r"/index", MainHandler),  # url--对应类,django对应的是函数
    ],
        **settings  # 加载配置
    )
    
    
    if __name__ == "__main__":
        application.listen(8888)
        ioloop.IOLoop.instance().start()
    

    查看效果:

    提交后:

    二、路由系统

    路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类。

    import tornado.ioloop
    import tornado.web
      
      
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("Hello, world")
      
    class StoryHandler(tornado.web.RequestHandler):
        def get(self, story_id):
            self.write("You requested the story " + story_id)
      
    class BuyHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("buy.wupeiqi.com/index")
      
    application = tornado.web.Application([
        (r"/index", MainHandler),
        (r"/story/([0-9]+)", StoryHandler),
    ])
      
    application.add_handlers('buy.wupeiqi.com$', [
        (r'/index',BuyHandler),
    ])
      
    if __name__ == "__main__":
        application.listen(80)
        tornado.ioloop.IOLoop.instance().start()
    

      

  • 相关阅读:
    词法分析
    HTTP学习笔记
    Servlet入门
    UDP与TCP的区别
    C语言实现血型查询系统
    Mysql的索引、回表查询及覆盖索引浅析
    ReentranLock浅析
    CAS是个什么鬼?
    synchronize和volatile 小知识点总结
    写一个简单的阻塞队列
  • 原文地址:https://www.cnblogs.com/wumingxiaoyao/p/6733510.html
Copyright © 2020-2023  润新知