tornado 入门教程第一篇,一个简单的web 服务

本教程从使用tornado编写一个简单的web应用开始,麻雀虽小,五脏俱全,以这个简单的示例为基础,你将逐步了解tornado框架的方方面面。

app.py

import tornado.ioloop
from tornado.web import RequestHandler, Application
from tornado.httpserver import HTTPServer
from tornado.options import options, define

define('port', default=8000, help='监听端口')


class HelloHandler(RequestHandler):
    def get(self):
        self.write('hello world')


if __name__ == '__main__':
    options.parse_command_line()
    handlers_routes = [
        (r'/', HelloHandler)
    ]
    app = Application(handlers=handlers_routes)
    http_server = HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

运行服务

python app.py

在浏览器里访问http://127.0.0.1:8000,页面里会显示hello world。

这个简单短小的web应用蕴藏了大部分tornado技术,我们可以以此为起点学习掌握tornado技术。

1. RequestHandler

RequestHandler 是专门用来处理客户端请求的类,你需要自定义一个类并继承它并实现对应的方法。我在示例里只实现了get方法,用它来处理get请求,如果你需要处理post请求就需要实现post方法。在RequestHandler类,一共定义了7个处理请求的方法

def _unimplemented_method(self, *args: str, **kwargs: str) -> None:
    raise HTTPError(405)

head = _unimplemented_method  # type: Callable[..., Optional[Awaitable[None]]]
get = _unimplemented_method  # type: Callable[..., Optional[Awaitable[None]]]
post = _unimplemented_method  # type: Callable[..., Optional[Awaitable[None]]]
delete = _unimplemented_method  # type: Callable[..., Optional[Awaitable[None]]]
patch = _unimplemented_method  # type: Callable[..., Optional[Awaitable[None]]]
put = _unimplemented_method  # type: Callable[..., Optional[Awaitable[None]]]
options = _unimplemented_method  # type: Callable[..., Optional[Awaitable[None]]]

根据自定义类需要处理的请求的method来实现对应的方法。

2. Application

Application对应整个web应用,在创建Application时需要指定handlers参数,它是一个列表,列表里的元素是元组,元组的第一个元素是正则表达式,用来匹配请求的path,元组的第二个元素是你自定义的Handler, 这个Handler用来处理与正则表达式相匹配的请求。

handlers参数解决的是请求与处理请求类之间的映射关系,它的作用等同于flask的路由。

3. HTTPServer

tornado 既是一个web框架也是一个web服务器,web框架让我们专注于处理业务逻辑,Application是web框架体现,HTTPServer是web服务器的体现。

怎么区分他们呢?你就看在哪里设置监听host和端口号,host与端口号是一组和服务器相关的概念,web框架不涉及这些东西,web框架只帮助你快速的进行web应用的开发,而host和端口号是部署的时候用的。http_server.listen(8000) 表明要监听8000端口,listen方法还可以设置address参数,默认是空字符串,表示监听地址是0.0.0.0。

def listen(self, port: int, address: str = "") -> None:

4. ioloop

ioloop模块是tornado的精髓所在,tornado之所以具有较高的性能,全赖ioloop提供的异步io能力。对于ioloop,在初学阶段,你只需要掌握这一行代码就足够了

tornado.ioloop.IOLoop.current().start()

5. define 与 options

define和options相互配合以实现tornado web应用的配置,define定义web启动时的各项参数,options.parse_command_line()函数解析启动命令中的参数,port参数设置有默认值,如果我在启动时不指定端口,则使用默认端口号8000,我也可以指定端口号

python web.py --port=8001

程序启动后,options.port的值是8001

6. 总结

本篇教程作为tornado入门系列的第一节,带你快速了解如何编写一个tornado web应用,介绍了tornado的几个重要概念,后续的教程将围绕这些知识点逐步展开。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案