深入理解Python的Tornado Web框架

ErJinZhi
• 阅读 633

一、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都是一个值得考虑的选择。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
3年前
tornado框架&三层架构&MVC&MTV&模板语言&cookie&session
web框架的本质其实就是socket服务端再加上业务逻辑处理,比如像是Tornado这样的框架.有一些框架则只包含业务逻辑处理,例如Django,bottle,flask这些框架,它们的使用需要依赖包含socket的第三方模块(即wsgiref)来运行在python中常见的web框架构建模式有以下两种:
Easter79 Easter79
3年前
tornado配合celery及rabbitmq实现web request异步非阻塞
Tornado和Celery介绍1.TornadoTornado是一个用python编写的一个强大的、可扩展的异步HTTP服务器,同时也是一个web开发框架。tornado是一个非阻塞式web服务器,其速度相当快。得利于其非阻塞的方式和对epoll的运用,tornado每秒可以处理数以千计的
Easter79 Easter79
3年前
tornado+peewee
前言:需要异步操作MySQL,又要用orm,使用sqlalchemy需要加celery,觉得比较麻烦,选择了peeweeasync开发环境python3.6.8peeweeasync0.5.12peewee2.10.2数据库:MySQL,使用peeweeasync需要依赖库pipinstal
隔壁老王 隔壁老王
4年前
tornado入门笔记
官方文档https://www.tornadoweb.org/en/stable/简单使用/usr/bin/envpythoncoding:utf8Author:Wjyimporttornado.ioloop启动importtornado.web请求对象importtornado.tem
威尔we 威尔we
4年前
Tornado API 服务开发
本文讲述如何使用Tornado(http://www.tornadoweb.org/)Web框架来开发一个简单的API服务,以及如何使用Docker工具来构建镜像和部署服务。项目代码已在GitHub开源,JWTornadoDemo(https://github.com/jaggerwang/jwtornadodemo)。
Stella981 Stella981
3年前
Python Tornado搭建高并发Restful API接口服务
Tornado和现在的主流Web服务器框架(包括大多数Python的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快能实现高并发。得利于其非阻塞的方式和对epoll的运用,Tornado每秒可以处理数以千计的连接,这意味着对于实时Web服务来说,Tornado是一个理想的Web框架。Tornado不同于其他pytho
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
ErJinZhi
ErJinZhi
Lv1
愿所有的不安,都是虚惊一场。
文章
3
粉丝
0
获赞
0