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 — 单元测试