一、Tornado的基本介绍
Tornado是一个开源的Python Web框架和异步网络库,最初由FriendFeed开发,后被Facebook收购。它以其高性能和非阻塞I/O特性在Web开发领域备受青睐,特别适合处理大量并发连接的应用,如聊天应用、实时数据处理和WebSocket服务。
二、Tornado的核心特性
- 异步I/O:Tornado使用非阻塞网络I/O,可以同时处理成千上万个连接,非常适合长连接和实时通信。
- Web框架:Tornado提供了一个简单的Web框架,可以轻松创建RESTful API和Web应用。
- 模板引擎:Tornado内置了一个简单的模板引擎,用于生成HTML页面。
- WebSocket支持:Tornado原生支持WebSocket,可以用于构建实时Web应用。
三、Tornado的简单使用
1. 安装
Tornado可以通过pip命令进行安装:
pip install tornado
安装完成后,可以通过以下命令验证是否安装成功:
python -c "import tornado; print(tornado.version)"
如果成功输出版本号,则表示安装成功。
2. 基础用法
创建一个简单的HTTP服务器
以下是一个简单的Tornado应用,响应HTTP请求:
import tornado.ioloop
import tornado.webclass MainHandler(tornado.web.RequestHandler):def get(self):self.write("Hello, Tornado!")def make_app():return tornado.web.Application([(r"/", MainHandler),])if __name__ == "__main__":app = make_app()app.listen(8888)print("Server is running at http://localhost:8888")tornado.ioloop.IOLoop.current().start()
在浏览器中访问 http://localhost:8888
,你会看到页面显示"Hello, Tornado!"。
使用模板
Tornado支持使用模板引擎来渲染HTML页面。以下是一个使用模板引擎的示例:
import tornado.ioloop
import tornado.webclass TemplateHandler(tornado.web.RequestHandler):def get(self):data = {"title": "Tornado Template", "content": "Hello, Tornado!"}self.render("template.html", **data)if __name__ == "__main__":app = tornado.web.Application([(r"/template", TemplateHandler),], template_path="templates")app.listen(8888)tornado.ioloop.IOLoop.current().start()
在这个示例中,template.html
是模板文件,位于 templates
目录下。
WebSocket支持
Tornado提供了强大的WebSocket支持,使得实时Web应用的构建变得更加容易。以下是一个简单的WebSocket示例:
import tornado.ioloop
import tornado.web
import tornado.websocketclass WebSocketHandler(tornado.websocket.WebSocketHandler):def open(self):print("WebSocket Connection Opened")def on_message(self, message):self.write_message(f"You said: {message}")def on_close(self):print("WebSocket Connection Closed")if __name__ == "__main__":app = tornado.web.Application([(r"/websocket", WebSocketHandler),])app.listen(8888)tornado.ioloop.IOLoop.current().start()
四、Tornado的高级用法
1. 异步I/O
使用Tornado的异步I/O特性,可以编写非阻塞的网络应用。以下是一个使用异步HTTP客户端的示例:
import tornado.ioloop
import tornado.web
from tornado.httpclient import AsyncHTTPClientasync def fetch_url(url):http_client = AsyncHTTPClient()response = await http_client.fetch(url)return response.bodyclass MainHandler(tornado.web.RequestHandler):async def get(self):url = "http://httpbin.org/get"response = await fetch_url(url)self.write(response)def make_app():return tornado.web.Application([(r"/", MainHandler),])if __name__ == "__main__":app = make_app()app.listen(8888)tornado.ioloop.IOLoop.current().start()
2. WebSocket支持
以下是一个WebSocket服务端的示例,它能够接收客户端的消息并回显:
import tornado.ioloop
import tornado.web
import tornado.websocketclass WebSocketHandler(tornado.websocket.WebSocketHandler):def open(self):print("WebSocket opened")def on_message(self, message):self.write_message(u"You said: " + message)def on_close(self):print("WebSocket closed")def make_app():return tornado.web.Application([(r"/websocket", WebSocketHandler),])if __name__ == "__main__":app = make_app()app.listen(8888)tornado.ioloop.IOLoop.current().start()
3. UI模块
以下是一个使用UI模块的示例,它允许在模板中调用模块:
import tornado.ioloop
import tornado.webclass Entry(tornado.web.UIModule):def render(self, entry, show_comments=False):return self.render_string("module-entry.html", entry=entry, show_comments=show_comments)def make_app():return tornado.web.Application([(r"/", HomeHandler),], ui_modules=globals())class HomeHandler(tornado.web.RequestHandler):def get(self):self.render("home.html")if __name__ == "__main__":app = make_app()app.listen(8888)tornado.ioloop.IOLoop.current().start()
4. 异步数据库操作
以下是一个使用异步Peewee操作数据库的示例:
import peewee_async
from peewee import *db = peewee_async.MySQLDatabase('tornado_db', host='127.0.0.1', port=3306, user='root', password='xxx')
manager = peewee_async.Manager(database=db)class Company(Model):name = CharField(verbose_name='公司名称')class Meta:database = dbclass Music(Model):name = CharField(verbose_name='音乐名称')company = ForeignKeyField(Company, backref='musics')class Meta:database = dbasync def create_data():await manager.create(Music, name='逆战', singer='张杰', company=1)if __name__ == "__main__":import asyncioloop = asyncio.get_event_loop()loop.run_until_complete(create_data())loop.close()
5. 配置选项
以下是一个使用Tornado配置选项的示例:
from tornado.options import define, options, parse_command_linedefine("port", default=8888, help="run on given port", type=int)if __name__ == "__main__":parse_command_line()app = tornado.web.Application([(r"/", MainHandler),])app.listen(options.port)tornado.ioloop.IOLoop.current().start()
6. 异步HTTP客户端
以下是一个使用异步HTTP客户端的示例:
from tornado.httpclient import AsyncHTTPClientAsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")http_client = AsyncHTTPClient()
response = http_client.fetch("http://httpbin.org/get")