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日

相关文章

  • oracle关键字作为字段名使用方法

    当使用Oracle关键字作为字段名时,需要用双引号将字段名括起来,这样Oracle才能识别为字段名而不是关键字。 下面是使用Oracle关键字作为字段名的示例: 示例1: 假设有一个Oracle表格,表格名为Students,字段包括姓名、年龄等,而其中一个字段名为“SELECT”,则可以按照以下方式进行查询: SELECT "SELECT&quo…

    database 2023年5月21日
    00
  • MySQL中日期型单行函数代码详解

    以下是MySQL中日期型单行函数的详细攻略: 一、日期型单行函数 MySQL提供了丰富的日期型单行函数,方便用户进行日期类型数据的处理。 1.1 CURDATE()函数 该函数用于返回当前日期,格式为’YYYY-MM-DD’。 示例: SELECT CURDATE(); 结果为: +————+ | CURDATE() | +———…

    database 2023年5月22日
    00
  • MySQL DATEDIFF() 函数

    定义和用法 DATEDIFF() 函数返回两个日期之间的天数。 语法 DATEDIFF(date1,date2) date1 和 date2 参数是合法的日期或日期/时间表达式。 注释:只有值的日期部分参与计算。 实例 例子 1 使用如下 SELECT 语句: SELECT DATEDIFF(‘2008-12-30′,’2008-12-29’) AS Dif…

    MySQL 2023年4月13日
    00
  • SQL 找出当前月份的第一个和最后一个星期一

    找出当前月份的第一个和最后一个星期一,可以使用SQL语句结合日期函数来实现。 第一个星期一的日期 要找出当前月份的第一个星期一,可以使用WEEKDAY函数来获取当前月份的第一天是星期几,并根据星期几来计算第一个星期一的日期。 SELECT CASE — 第一天是星期一 WHEN WEEKDAY(DATE_FORMAT(CURRENT_DATE, ‘%Y-%…

    database 2023年3月27日
    00
  • Hue 和 Pig 的区别

    Hue与Pig是Apache Hadoop生态系统中两个不同的工具。它们都是为大数据处理而设计的,但它们的设计思想和主要任务不同。下面我们来详细讲解它们之间的区别。 Hue 概述 Hue是Apache Hadoop生态系统中的一个Web界面工具,可以帮助用户轻松地使用Hadoop平台的各种功能,例如:文件管理、Hive查询、Oozie工作流、Spark和Pi…

    database 2023年3月27日
    00
  • Windows 本地安装mysql8.0

    前言 看了网上许多关于Windows 本地安装mysql的很多教程,基本上大同小异。但是安装软件有时就可能因为一个细节安装失败。我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的。现我将自己本地安装的步骤总结如下,如有不对的地方,敬请大家批评指正!!! 安装环境:win7/10 一、下载Mysql的安装包 我本地安装是Mysql8.0的版本,所…

    MySQL 2023年4月14日
    00
  • Oracle如何在SQL语句中对时间操作、运算

    在Oracle中,可以通过使用一系列的时间函数来对时间进行操作和运算。下面是一些常见的时间函数及其用法。 1. 获取当前时间 SYSDATE SYSDATE函数返回当前数据库服务器的系统日期和时间。 示例: SELECT SYSDATE FROM DUAL; 输出结果: SYSDATE ——————- 2022-09-23 15:35…

    database 2023年5月21日
    00
  • Mysql中@和@@符号的详细使用指南

    当我们在MySQL中使用特殊字符时,有些符号会有特殊的含义。其中包括@和@@符号,它们在MySQL中有着不同的用法。本攻略详细讲解了这些符号的使用方法。 @符号 在MySQL中,@符号被用来作为用户变量的标志。用户可以定义并使用这些变量,以便在查询中轻松地存储和检索值。可以通过在变量名称前加@符号定义用户变量。 以下是定义变量的示例: SET @name :…

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