百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

03.Tornado路由(tornado 路由)

ccwgpt 2024-10-14 08:42 27 浏览 0 评论

03.Tornado路由

?Tornado的URL与类的关系是通过其路由系统实现的,每个URL对应的是一个类,而不是像其他框架中那样URL直接对应一个函数。

在Tornado中,路由系统通过将URL模式与处理类进行关联,实现了HTTP请求的分发和处理。这种设计使得Tornado的路由系统具有更高的灵活性和扩展性。具体来说,Tornado的路由系统允许开发者定义URL模式,并将这些模式与特定的处理类进行关联。当HTTP请求到达时,Tornado会根据请求的URL与预定义的URL模式进行匹配,然后将请求交给与之匹配的处理类进行处理。

这种设计的好处在于,它使得Tornado的路由系统能够更好地处理复杂的URL结构和请求处理逻辑。通过将URL模式与处理类进行关联,Tornado能够实现更精细的控制和处理各种HTTP请求,从而构建出功能丰富、结构清晰的Web应用程序。

此外,Tornado的路由系统还支持RESTful风格的URL设计,这对于构建基于资源的Web服务非常有用。通过定义不同的URL模式和对应的处理类,可以很容易地实现诸如获取、添加、更新和删除资源等操作,从而满足构建现代Web应用程序的需求。

总的来说,Tornado的URL与类的关系是通过其独特的路由系统实现的,每个URL模式对应一个处理类,这种设计使得Tornado在处理复杂的Web请求时具有更高的灵活性和扩展性?。

3.1Web应用程序基本结构

看如下示例:

import asyncio
import tornado

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

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

async def main():
    app = make_app()
    app.listen(8888)
    shutdown_event = asyncio.Event()
    await shutdown_event.wait()

if __name__ == "__main__":
    asyncio.run(main())

在上面的代码中:

  1. 通过 import 语句引入 asyncio 和 tornado 包,引入这两个包是 Tornado 程序的基础。
  2. 实现一个 tornado.web.RequestHandler 的子类,重载其中的 get()函数,该函数负责处理相应定位到该 RequestHandler 的 HTTP GET 请求。本例中简单地通过 self.write()函数输出“Hello world”。
  3. 定义了 make_app()函数,该函数返回一个 web.Application 对象。该对象的第 1 个参数用于定义 Tornado 程序的路由映射。本例将对根 URL 的访问映射到了 RequestHandler 的子类MainHandler 中。
  4. 用 app.listen()函数指定服务器监听的端口。
  5. 用 tornado.ioloop.IOLoop.current().start()启动 IOLoop,该函数将一直运行且不退出,
  6. 调用 asyncio.Event() 实例的?wait()方法等待事件被设置,在事件被设置之前处理所有客户端的访问请求。

3.2路由解析

在Tornado中,向 web.Application 对象传递的第 1 个参数 URL 路由映射列表,用正则字符串进行路由匹配。

Tornado 的路由字符串有两种:固定字符串路径和参数字符串路径。

3.2.1固定字符串路径

固定字串即普通的字符串固定匹配,比如:

Handlers = [ ("/", MainHandler),    # 只匹配根路径
    ("/entry", EntryHandler),    # 只匹配/entry 
    ("/entry/2015", Entry2015Hander),    # 只匹配/entry/2015 
]

3.2.2参数字符串路径

参数字符串可以将具备一定模式的路径映射到同一个 RequesetHandler 中处理,其中路径中的参数部分用小括号“()”标识,下面是一个参数路径的例子:

import tornado

class EntryHandler(tornado.web.RequestHandler):
    def get(self, slug):
        self.write('Hello, {0}'.format(slug))

handlers = [(r"/entry/([^/]+)", EntryHandler),]

本例中用“/entry/([^/]+)”定义“以/entry/开头的 URL”模式,小括号中的内容是正则表达式,URL 尾部的变量部分以参数形式传递给 RequestHandler 的 get()函数,本例中将该参数命名为 slug。

3.2.2.1参数路径的默认值

之前例子中的 handlers = [(r"/entry/([^/]+)", EntryHandler),]模式定义了客户端必须输入路径参数。比如,其能够匹配如下路径:

http://xx.xx.xx.xx/entry/abc 
http://xx.xx.xx.xx/entry/2024-09-11

但是其无法匹配:

http://xx.xx.xx.xx/entry

对于需要匹配客户端未传入时的路径,则需要用如下方法改变 URL 路径和对 get()函数的定义:

import tornado

class EntryHandler(tornado.web.RequestHandler):
    def get(self, slug):
        if slug=='': slug='default'
        self.write('Hello, {0}'.format(slug))

handlers = [(r"/entry/?([^/]*)", EntryHandler),]

本例中首先用 “*” 取代 “+” ,并在"/"后面增加了"?",定义了 URL 模式 “/entry/?([^/]*)”,然后为 RequestHandler子类的 get()函数中对 slug 参数设置了默认值 default。

3.2.2.2 多参数路径

参数路径还允许在一个 URL 模式中定义多个可变参数,比如:

import tornado

class EntryHandler(tornado.web.RequestHandler):
    def get(self, year, month, day, slug):
        self.write('Hello, {0}, your birthday is {1}-{2}-{3}'.format(slug, year, month, day))

handlers = [(r"/entry/(\d{4})/(\d{2})/(\d{2})/([^/]+)/?", EntryHandler),]

本例中的 URL 模式定义了 year、month、day、slug 等 4 个参数。

注:"/"后面的"?"表示访问时尾部的斜杠可以省略。

相关推荐

RACI矩阵:项目管理中的角色与责任分配利器

作者:赵小燕RACI矩阵RACI矩阵是项目管理中的一种重要工具,旨在明确团队在各个任务中的角色和职责。通过将每个角色划分为负责人、最终责任人、咨询人和知情人四种类型,RACI矩阵确保每个人都清楚自己...

在弱矩阵组织中,如何做好项目管理工作?「慕哲制图」

慕哲出品必属精品系列在弱矩阵组织中,如何做好项目管理工作?【慕哲制图】-------------------------------慕哲制图系列0:一图掌握项目、项目集、项目组合、P2、商业分析和NP...

Scrum模式:每日站会(Daily Scrum)

定义每日站会(DailyScrum)是一个Scrum团队在进行Sprint期间的日常会议。这个会议的主要目的是为了应对Sprint计划中的不断变化,确保团队能够有效应对挑战并达成Sprint目标。为...

大家都在谈论的敏捷开发&Scrum,到底是什么?

敏捷开发作为一种开发模式,近年来深受研发团队欢迎,与瀑布式开发相比,敏捷开发更轻量,灵活性更高,在当下多变环境下,越来越多团队选择敏捷开发。什么是敏捷?敏捷是一种在不确定和变化的环境中,通过创造和响应...

敏捷与Scrum是什么?(scrum敏捷开发是什么)

敏捷是一种思维模式和哲学,它描述了敏捷宣言中的一系列原则。另一方面,Scrum是一个框架,规定了实现这种思维方式的角色,事件,工件和规则/指南。换句话说,敏捷是思维方式,Scrum是规定实施敏捷哲学的...

敏捷项目管理与敏捷:Scrum流程图一览

敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示,以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例:这个流程图涵盖了Scrum框架的主要阶段和活动,其中包...

一张图掌握项目生命周期模型及Scrum框架

Mockito 的最佳实践(mock方法)

记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...

EffectiveJava-5-枚举和注解(java枚举的作用与好处)

用enum代替int常量1.int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种...

Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!

Maven简介Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。仔...

Java单元测试框架PowerMock学习(java单元测试是什么意思)

前言高德的技术大佬在谈论方法论时说到:“复杂的问题要简单化,简单的问题要深入化。”这句话让我感触颇深,这何尝不是一套编写代码的方法——把一个复杂逻辑拆分为许多简单逻辑,然后把每一个简单逻辑进行深入实现...

Spring框架基础知识-第六节内容(Spring高级话题)

Spring高级话题SpringAware基本概念Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的。但是在实际的项目中,你的Bean必须要意识到Spring容器...

Java单元测试浅析(JUnit+Mockito)

作者:京东物流秦彪1.什么是单元测试(1)单元测试环节:测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等。相关含义如下:1)单元测试:针对计算机程序模块进行输出正确性检验工作...

揭秘Java代码背后的质检双侠:JUnit与Mockito!

你有没有发现,现在我们用的手机App、逛的网站,甚至各种智能设备,功能越来越复杂,但用起来却越来越顺畅,很少遇到那种崩溃、卡顿的闹心事儿?这背后可不是程序员一拍脑袋写完代码就完事儿了!他们需要一套严谨...

单元测试框架哪家强?Junit来帮忙!

大家好,在前面的文章中,给大家介绍了以注解和XML的方式分别实现IOC和依赖注入。并且我们定义了一个测试类,通过测试类来获取到了容器中的Bean,具体的测试类定义如下:@Testpublicvoid...

取消回复欢迎 发表评论: