tornado 02从helloworld开始一个项目 - nuanxin1111/react GitHub Wiki

环境搭建工作完成后,不同于在django里我们可以生成一个项目结构,然后构建我们的app,tornado里面我们的项目从0开始。 Tornado是一个编写对HTTP请求响应的框架。作为程序员,我们的工作是编写响应特定条件HTTP请求的响应的handler。那么,我们开始我们第一个简单的实例: demo1.py

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

这时我们在终端上运行

python demo1.py

然后打开浏览器地址栏输入:

http://127.0.0.1:8888

这时我们的hello,world就出来了。现在我们来逐步分析一下这个微型的http server.

import tornado.ioloop
import tornado.web

前两行我们导入了tornado的两个模块ioloop和web.

  • IOLoop Tornado为了实现高并发和高性能,使用了一个IOLoop来处理socket的读写事件, IOLoop依据不同的平台使用不同的模型,在Linux下封装了epoll, 可以高效的响应网络事件,这是Tornado高效的保证.
  • tornado.web 其中定义了 Application 和 RequestHandler 类,Application 是个单例,总揽全局路由,创建服务器负责监听,并把服务器传回来请求进行转发(call)。RequestHandler是个功能很丰富的类,基本上 web 开发需要的它都具备了,比如redirect,flush,close,header,cookie,render(模板),xsrf,etag等等.
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

这是Tornado的请求处理函数类。当处理一个请求时,Tornado将这个类实例化,并调用与HTTP请求方法所对应的方法。在这个例子中,我们只定义了一个get方法,也就是说这个处理函数将对HTTP的GET请求作出响应,实际上RequestHandler类中定义了处理这些http方法的函数。

RequestHandler.get(*args, **kwargs)
RequestHandler.head(*args, **kwargs)
RequestHandler.post(*args, **kwargs)
RequestHandler.delete(*args, **kwargs)
RequestHandler.patch(*args, **kwargs)
RequestHandler.put(*args, **kwargs)
RequestHandler.options(*args, **kwargs)

接下来,我们定义了make_app方法,它返回一个Application实例。

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
        ])

通过查看web.py源码,我们发现Application的__init__方法的原型

  def __init__(self, handlers=None, default_host="", transforms=None, **settings):

其中最重要的是handlers参数,它定义了路由和处理函数之间的映射,就像我们使用django的时候中的urls文件。 default_host。当tornado接受到request但是没有指定handler或者没有能够匹配的handler的时候,使用default_host做自动跳转。 settings。这个是对于当前webserver的一些配置项,后面我们会用到。

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

这是使我们的服务真正开始运行的语句,make_app返回一个Application实例后,调用listen监听8888端口。 这里的IOLoop类似的封装了我们在网络编程中的accept以及对应的recv/send操作,然后不断的循环处理。

附注上tornado框架结构:

  • Core web framework

tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类

tornado.httpserver — 一个无阻塞HTTP服务器的实现

tornado.template — 模版系统

tornado.escape — HTML,JSON,URLs等的编码解码和一些字符串操作

tornado.locale — 国际化支持

  • Asynchronous networking 底层模块

tornado.ioloop — 核心的I/O循环

tornado.iostream — 对非阻塞式的 socket 的简单封装,以方便常用读写操作

tornado.httpclient — 一个无阻塞的HTTP服务器实现

tornado.netutil — 一些网络应用的实现,主要实现TCPServer类

  • Integration with other services

tornado.auth — 使用OpenId和OAuth进行第三方登录

tornado.database — 简单的MySQL服务端封装

tornado.platform.twisted — 在Tornado上运行为Twisted实现的代码

tornado.websocket — 实现和浏览器的双向通信

tornado.wsgi — 与其他python网络框架/服务器的相互操作

  • Utilities

tornado.autoreload — 生产环境中自动检查代码更新

tornado.gen — 一个基于生成器的接口,使用该模块保证代码异步运行

tornado.httputil — 分析HTTP请求内容

tornado.options — 解析终端参数

tornado.process — 多进程实现的封装

tornado.stack_context — 用于异步环境中对回调函数的上下文保存、异常处理

tornado.testing — 单元测试