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

03.Tornado路由(tornado 路由)

ccwgpt 2024-10-14 08:42 20 浏览 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 个参数。

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

相关推荐

MFC、Qt、WPF?该用哪个?(mfc和wpf区别)

MFC、Qt和WPF都是流行的框架和工具,用于开发图形用户界面(GUI)应用程序。选择哪个框架取决于你的具体需求和偏好。MFC(MicrosoftFoundationClass)是微软提供的框架,...

一款WPF开发的通讯调试神器(支持Modbus RTU、MQTT调试)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍Wu.CommTool是一个基于C#、WPF、Prism、MaterialDesign...

关于面试资深C#、WPF开发工程师的面试流程和问题

一、开场(2-3分钟)1.欢迎应聘者,简单介绍公司和面试流程。2.询问应聘者是否对公司或岗位有初步的问题。二、项目经验与技术应用(10-20分钟)1.让应聘者详细介绍几个他参与过的C#、...

C# WPF MVVM模式Prism框架下事件发布与订阅

01—前言处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行...

WPF 机械类组件动画制作流程简述(wps上怎么画机械结构简图)

WPF机械类组件动画制作流程简述独立观察员2025年3月4日一、创建组件创建组件用户控件,将组件的各部分“零件”(图片)拼装在一起,形成组件的默认状态:二、给运动部分加上Rend...

C#上位机WinForm和WPF选哪个?工控老油条的"血泪史"

作为一个从互联网卷进工控坑的"跨界难民",在这会摸鱼的时间咱就扯一下上位机开发选框架这档子破事。当年我抱着WPF的酷炫动画一头扎进车间,结果被产线老师傅一句"你这花里胡哨的玩意...

【一文扫盲】WPF、Winform、Electron有什么区别?

近年来,随着软件开发的不断发展,开发人员面临着选择适合他们项目的各种框架和工具的挑战。在桌面应用程序开发领域,WPF、Winform和Electron是三个备受关注的技术。本文将介绍这三者的区别,帮助...

一个开源、免费、强大且美观的WPF控件库

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍HandyControl是一套基于WPF(WindowsPresentationF...

WPF 根据系统主题自动切换浅色与深色模式

WPF根据系统主题自动切换浅色与深色模式控件名:Resources作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopers...

WPF与WinForm的本质区别(wpf与maui)

在Windows应用程序开发中,WinForm和WPF是两种主要的技术框架。它们各自有不同的设计理念、渲染机制和开发模式。本文将详细探讨WPF与WinForm的本质区别,并通过示例进行说明。渲染机制W...

Win10/Win11效率神器再进化:微软发布PowerToys 0.90.0版本

IT之家4月1日消息,微软今天(4月1日)更新PowerToys,在最新发布的0.90.0版本中,修复多个BUG之外,引入多项功能更新,为Windows10、Windows...

一款非常漂亮的WPF管理系统(wpf架构及特性)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!WPFManager项目介绍该项目是一款WPF开发的管理系统,数据库采用的MSSqlserv...

WPF 实现描点导航(wpf按钮的点击事件)

WPF实现描点导航控件名:NavScrollPanel作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPF...

微软更新基于Win11的Validation OS 2504:增强 .NET与WPF

IT之家5月1日消息,科技媒体NeoWin今天(5月1日)发布博文,报道称微软公司更新基于Windows11的ValidationOS,增强支持.NET和WPF,并优...

WPF的技术架构与优势(wpf的前景)

WindowsPresentationFoundation(WPF)是一个现代化的用户界面框架,专为构建Windows应用程序而设计。它通过分层的技术架构和丰富的功能集,提供了全面的应用程...

取消回复欢迎 发表评论: