0. 第一个Tornado应用

@hanq  2020年10月16日 10:53

Tornado

Tornado是一个基于Python的Web服务框架和 异步网络库。
通过非阻塞I/O,实现高并发,并提供了很多实用的工具类库。

构成

  • Web框架
  • HTTP客户端和服务器实现
  • 异步网络库
  • 协程库

Tornado采用的是单进程单线程异步I/O网络模型。
Tornado可以直接作为Web Server来运行,也可以支持WSGI。

快速上手

import tornado.ioloop
import tornado.web


# 请求处理器
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello Tornado")


if __name__ == "__main__":
    application = tornado.web.Application([
        (r"/", MainHandler),
    ])
    application.listen(8888)
    tornado.ioloop.IOLoop.current().start()

从代码可以看出,Tornado需要一个请求处理器,一个路由,一个webApplication实例,指定一个端口号,随后通过IOLoop启动起来。

当然,在Win系统,Python3.8+ 系统直接运行上面的代码会大概率提示一个错误:

raise NotImplementedError

是因为3.8的默认asyncio 依赖不同了,所以,参照下面的代码,第一个支持get方式的tornado服务器就可以运行起来了。

#! /usr/bin/python
# encoding:utf-8

import tornado.ioloop
import tornado.httpserver
import tornado.web
import tornado.options

from tornado.options import define, options

# Python 3.8+ 对WIN的兼容 @see https://blog.csdn.net/hank5658/article/details/106870245
import platform

if platform.system() == "Windows":
    import asyncio

    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

# 定义端口号
define('port', type=int, default=8182, help='web server port')


# 创建请求处理器
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        client_id = self.get_argument('id', None)
        if client_id is None:
            self.write('You are bad client!')
        else:
            self.write('Welcome client:' + str(client_id))


# 创建路由表
urls = [(r'/', MainHandler), ]


# 创建服务器
def make_app():
    # 解析命令行参数
    tornado.options.parse_command_line()
    # 创建服务器应用,指定路由表
    app = tornado.web.Application(urls)
    # 指定服务器端口
    app.listen(options.port)
    # 启动服务器
    tornado.ioloop.IOLoop.current().start()


# 应用入口
if __name__ == '__main__':
    make_app()


添加新评论