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技术站