Tornado路由与Application的实现

Tornado 是一款快速、可伸缩的 WebSocket 和 HTTP 服务器,也是一个 Python Web 框架。在 Tornado 中,路由是实现 URL 映射的一种必要手段。本文将提供一份 Tornado 路由与 Application 实现的完整攻略。

基础概念

在开始对 Tornado 路由与 Application 进行讲解之前,需要对以下几个基本概念进行说明:

  • URL:统一资源定位符,用来指定 web 上的资源;
  • 路由:指将 URL 映射到处理该 URL 的相应函数的机制;
  • 匹配规则:路由需要用到匹配规则,来根据请求的 URL 找到相应的处理函数;
  • Application:Tornado 中最基本的 Web 应用,包含重新启动、停止、调试以及配置应用的接口。

实现步骤

在 Tornado 中实现路由与 Application,主要包括以下几个步骤:

第一步:导入 Tornado 库

在 Python 代码中,首先要导入 Tornado 框架提供的库。通常情况下,我们需要引入下列库:

import tornado.ioloop
import tornado.web
  • tornado.ioloop:Tornado 的核心 ioloop 事件循环模块,提供了应用程序的主循环和事件循环函数。
  • tornado.web:Tornado 的 Web 模块,提供了一系列有用的 Web 开发相关组件、方法和类。

第二步:编写处理请求的 Handler

Tornado 中的请求处理器被称为 Handler,是实现业务逻辑的主要组件。具体操作如下:

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, World")

以上代码是一个最简单的处理请求的 Handler 类,它匹配默认的 / URL,并输出“Hello, World”。

第三步:定义路由规则

定义路由规则是指将请求的 URL 映射到对应的处理器的过程。在 Tornado 中定义路由规则需要注册一个 Application 对象,并使用该对象的 add_handlers() 方法来实现 URL 映射。示例如下:

# 创建 Tornado web 应用实例
app = tornado.web.Application([
    (r'/', MainHandler),
])

以上代码首先创建了一个 Tornado 应用实例,并通过传递一个 URL 和 Handler 对象的列表进行实例化,映射了 '/main' URL 对应的 Handler 为 MainHandler

第四步:启动应用

在应用完成初始化和路由映射后,通过 Application 对象的 listen() 方法启动 Web 服务器并开始监听。

# 启动服务器
if __name__ == "__main__":
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

完整示例代码如下:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, World")

if __name__ == "__main__":
    # 创建 Tornado web 应用实例
    app = tornado.web.Application([
        (r'/', MainHandler),
    ])
    # 启动服务器
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

示例一:带参数的 URL 匹配

Tornado 路由中也支持 URL 带参数的匹配。例如我们可以通过 \/id\/([0-9]+) 的正则表达式来匹配 URL 中顺带的 id 号参数,并以此实现不同 URL 地址对应不同服务器的功能。

class IdHandler(tornado.web.RequestHandler):
    def get(self, id):
        self.write(f'Hello, id: {id}')

if __name__ == "__main__":
    # 创建 Tornado web 应用实例
    app = tornado.web.Application([
        (r'/id/(\d+)', IdHandler),
    ])
    # 启动服务器
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

以上代码示例中,IdHandler 类继承于 tornado.web.RequestHandler,对于 GET 请求添加了 id 参数,通过 {id} 来进行封装,在类体中实现处理函数。同时,在 Application 实例化时,我们设置了 (r'/id/(\d+)', IdHandler) 的方式来将 IdHandler 映射到路由规则上。

示例二:使用正则表达式来进行 URL 匹配

在 Tornado 中,我们可以使用正则表达式来对 URL 进行匹配,这就意味着对 URL 进行更加灵活的处理。例如,我们可以通过以下方式实现对于来自白名单外的 IP 地址请求进行拦截。

class UnregReqHandler(tornado.web.RequestHandler):
    def get(self):
        self.set_header('Content-Type', 'text/plain')
        self.write("Invalid Request")

if __name__ == "__main__":
    # 白名单 IP 地址列表
    white_ips = ['127.0.0.2', '127.0.0.3']

    # 创建 Tornado web 应用实例,以及正则表达式路由规则
    # 形如 /id/[...],包含任意字符串或数字的 URL 地址都会被拦截
    regex_rule = r'/id/.*'
    app = tornado.web.Application([
        (regex_rule, UnregReqHandler),
    ])

    def check_whitelist(request_handler):
        addr = request_handler.request.remote_ip
        if addr not in white_ips:
            request_handler.clear()
            request_handler.set_status(403)
            request_handler.finish()

    app.add_handlers('.*', [(regex_rule, check_whitelist)])
    # 启动服务器
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

以上代码示例中不单独为 URI 设计 Handler,而是利用正则表达式 r'/id/.*' 进行路由分发。在 Application 实例中,我们并未指定对应的 Handler,而是在调用 check_whitelist() 处理函数时进行了请求拦截。这里可以指定任意正则表达式来进行路由匹配,开发者可以根据自己的需求来适配路径规则,实现不同的业务逻辑。

总结

至此,我们已经学习了 Tornado 路由与 Application 的实现方法。在实际开发中,以上步骤是创建基于 Tornado 的 Web 应用的基础,可以针对不同的业务需求进行应用和深度拓展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Tornado路由与Application的实现 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Redis 向集群添加新节点

      1. 启动集群服务(向集群添加新节点,则说明,集群是已知的)。   2. 搭建将要添加到集群的节点     (1)以集群的方式对新添加的节点进行配置:redis.conf.     (2)启动节点实例服务.    3.集群管理 可参考  Redis cluster tutorial 官网指导文档,往往是最新的。 一、启动集群服务:【命令在集群服务器执行】…

    Redis 2023年4月11日
    00
  • Mysql迁移Postgresql的实现示例

    Mysql和Postgresql都是非常常见的关系型数据库,但是在某些场景下可能需要将Mysql迁移到Postgresql。下面是一个Mysql迁移到Postgresql的实现示例。 1. 数据库迁移工具的选择 在进行数据库迁移时,通常需要使用专门的数据库迁移工具。常见的数据库迁移工具有: pgloader(https://github.com/dimitr…

    database 2023年5月21日
    00
  • CentOS 6.5 x64系统中安装MongoDB 2.6.0二进制发行版教程

    标题: CentOS 6.5 x64系统中安装MongoDB 2.6.0二进制发行版教程 简介 本文将介绍在 CentOS 6.5 x64 系统中安装 MongoDB 2.6.0 二进制发行版的详细步骤。这个方法可以适用于服务器和非服务器环境。 步骤 1. 准备工作 在开始安装前,我们需要先检查系统是否具有一些必要程序: $ yum -y update $ …

    database 2023年5月22日
    00
  • MySQL InnoDB存储引擎详解

    MySQL的InnoDB存储引擎是MySQL支持的一种事务型存储引擎,其提供了ACID(原子性、一致性、隔离性、持久性)事务支持和行级锁定。 ACID事务支持 ACID事务中的“原子性”是指在一个事务中的所有操作要么全部成功要么全部失败,不能只有部分成功部分失败。这样可以确保数据的一致性。 InnoDB通过写日志来确保原子性。当一个事务开始时,InnoDB会…

    MySQL 2023年3月9日
    00
  • 关于Linux的mariadb数据库

    关于 Linux 的 MariaDB 数据库攻略 MariaDB 数据库是一种开源的数据库管理系统,它是 MySQL 的分支版本。在 Linux 系统中,我们可以使用 apt-get 命令进行安装,具体的操作步骤如下: 步骤 1:添加 MariaDB apt-get 源 我们可以通过以下命令添加 MariaDB 的 apt-get 源: sudo apt-g…

    database 2023年5月22日
    00
  • MySQL笔记之Checkpoint机制

    CheckPoint是MySQL的WAL和Redolog的一个优化技术。   一、Checkpoint机制 CheckPoint做了什么事情?将缓存池中的脏页刷回磁盘。 checkpoint定期将db buffer的内容刷新到data file,当遇到内存不足、db buffer已满等情况时,需要将db buffer中的内容/部分内容(特别是脏数据)转储到d…

    2023年4月10日
    00
  • MySQL使用二进制日志还原数据库

    MySQL 是一种开源的关系型数据库管理系统,它的日志文件是用于恢复和备份的重要部分。MySQL 支持三种类型的二进制日志,分别是:二进制日志、事务日志、和错误日志。其中,二进制日志是 MySQL 最常用的日志类型,它记录了所有添加、更改和删除表记录的 SQL 语句,是一个重要的恢复和备份工具。本文将详细介绍如何使用 MySQL 二进制日志还原数据库。 启用…

    MySQL 2023年3月10日
    00
  • 使用SKIP-GRANT-TABLES 解决 MYSQL ROOT密码丢失

    当 MySQL 数据库中的 ROOT 用户密码丢失导致无法登录时,可以通过使用 SKIP-GRANT-TABLES 的方式修改密码。下面是详细讲解: 准备 在开始操作之前,需要先进行一些准备工作: 停止 MySQL 服务 找到 MySQL 数据库的配置文件 my.cnf,如果无法找到,可以尝试在终端使用以下命令查找:find / -name my.cnf 备…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部