Python的Tornado Web框架深入解析
作者:小小张说故事 发布时间:2021-11-28 03:14:51
一、Tornado简介
Tornado是一个使用Python编写的高效、非阻塞的web服务器软件和网络库。它被设计用于处理数以千计的并发连接,这是由于其非阻塞的I/O处理方式。Tornado最初是由FriendFeed开发的,这是一个社交聚合服务,后来被Facebook收购。Tornado通常被用于实时Web服务,需要处理大量长连接的情况。
二、安装和Hello World示例
首先,我们需要在Python环境中安装Tornado。在命令行中输入以下指令即可:
pip install tornado
安装完成后,我们可以编写一个最基本的Tornado应用,即Hello World:
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()
上述代码定义了一个简单的HTTP服务器,对于根URL("/")的GET请求,返回"Hello, world"。然后,我们在本地的8888端口上启动了这个服务器。
三、路由和请求处理
在Tornado中,每个HTTP请求都由一个RequestHandler
子类进行处理。这个子类需要定义一个对应于HTTP方法(如GET或POST)的方法。在上述的Hello World示例中,我们定义了一个get()
方法来响应GET请求。
每个RequestHandler
子类都关联一个URL模式,这个模式由Application
的路由配置决定。例如,以下代码将URL模式"/user"关联到了UserHandler
:
def make_app():
return tornado.web.Application([
(r"/user", UserHandler),
])
这意味着,对于URL"/user"的请求,将由UserHandler
进行处理。
四、模板和UI
Tornado包含一个强大的模板语言,使得生成动态HTML变得简单。在Tornado模板中,我们可以使用Python表达式,也可以使用控制流语句如for循环和if条件。
以下是一个Tornado模板的例子:
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<ul>
{% for item in items %}
<li>{{ escape(item) }}</li>
{% end %}
</ul>
</body>
</html>
在这个模板中,{{ title }}
和{{ escape(item) }}
是Python表达式,它们将被相应的值替换。{% for item in items %}
和{% end %}
则构成了一个for循环,用于生成一个列表。
五、异步和非阻塞I/O
Tornado的一个重要特点是其支持异步和非阻塞I/O。这使得Tornado可以在单个线程中处理数千个并发连接,从而有效地处理高负载的实时Web服务。
在Tornado中,我们可以使用@tornado.gen.coroutine
装饰器和yield
关键字编写异步操作,使得这些操作看起来像同步操作一样。例如,以下代码使用了Tornado的AsyncHTTPClient
进行异步HTTP请求:
from tornado.httpclient import AsyncHTTPClient
from tornado import gen
class MainHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
http_client = AsyncHTTPClient()
response = yield http_client.fetch("http://example.com")
self.write(response.body)
上述代码中,http_client.fetch()
是一个异步操作,它将立即返回一个Future
对象。yield
关键字将暂停当前的协程,直到这个Future
对象完成。在Future
完成后,yield
表达式的值将是Future
的结果,即HTTP响应。
六、WebSockets和实时服务
Tornado支持WebSockets,这是一个在单个TCP连接上提供全双工通信的协议。这使得Tornado可以很好地支持实时Web服务。
在Tornado中,我们可以通过继承WebSocketHandler
类并重写其方法来实现一个WebSocket服务。例如,以下代码实现了一个简单的回显WebSocket服务:
class EchoWebSocket(tornado.websocket.WebSocketHandler):
def open(self):
print("WebSocket opened")
def on_message(self, message):
self.write_message("You said: " + message)
def on_close(self):
print("WebSocket closed")
七、结论
Tornado是一个强大的Web框架和网络库,它支持异步和非阻塞I/O,支持WebSockets,包含一个模板语言,并提供了对许多HTTP功能的低级别访问。无论您是在构建一个实时Web服务,还是在寻找一个能处理高负载的Web框架,Tornado都是一个值得考虑的选择。
来源:https://segmentfault.com/a/1190000043842556


猜你喜欢
- 目录一、梳理功能二、准备数据库三、构造和数据库相关的实体类书籍用户NormalUser类四、封装数据库相关操作数据库链接操作针对书籍表操作针
- Mootools 1.2手风琴(Accordion)教程原文地址:30 Days of Mootools 1.2 Tutoria
- Upload组件是自带上传进度,但是样式调起来很麻烦,我们要做的就是自定义一个首先页面要引入组件 Upload, Progressuploa
- 一、初始化主界面import pygamepygame.init()screen = pygame.display.set_mode((50
- 脚本过于简单,供学习和参考。主要了解一下smtplib库的使用和超时机制的实现。使用signal.alarm实现超时机制。#!/usr/bi
- 介绍对于绘制某些类型的数据来说,瀑布图是一种十分有用的工具。不足为奇的是,我们可以使用Pandas和matplotlib创建一个可重复的瀑布
- // NewTimer creates a new Timer that will send// the current time on i
- PyCharm 光标变成了黑块,不能编辑代码。光标变黑块是因为输入方式变成了改写方式,INSERT可以切换 插入/改写模式。插入模式:把输入
- 问题一:TypeError: a bytes-like object is required, not 'str'解决:该问
- 本文实例讲述了MySQL从命令行导入SQL脚本时出现中文乱码的解决方法。分享给大家供大家参考,具体如下:在图形界面管理工具 MySql Qu
- 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思?函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进
- 1.聚合运算(1)使用内置的聚合运算函数进行计算1>内置的聚合运算函数sum(),mean(),max(),min(),size(),
- 0x01 生成shellcode首先通过下列命令生成一个shellcode,使用msfvenom -p选项来指定paylaod,这里选用wi
- 目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件)、
- 本文实例讲述了JS+CSS实现仿雅虎另类滑动门切换效果。分享给大家供大家参考。具体如下:这是仿照雅虎特色服务的一个Tab滑动切换效果,核心是
- 本文实例讲述了Python面向对象之接口、抽象类与多态。分享给大家供大家参考,具体如下:接口类继承有两种用途:一:继承基类的方法,并且做出自
- 原型图:项目需求:服务器接受到报警后将消息推送到前台,(通过前端实时消息提示的效果-websocket长轮询),前台接受到消息后需要发出警报
- 一、下载镜像docker Hub官网URL:https://hub.docker.com/_/mysql/下载最新版本:docker pul
- 先给大家展示下效果图: 核心代码如下所示:(‘.selectaddress').click(function () {//图一联系
- 序言作为当代新青年,应该多少会点短视频制作吧?哈哈,那当代自媒体创作者好了~制作视频的时候,多少需要一些搞怪的声音?或者奇怪的声音?音乐等等