首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将龙卷风路由到“基本”处理程序

将龙卷风路由到“基本”处理程序
EN

Stack Overflow用户
提问于 2017-12-25 17:07:47
回答 1查看 3K关注 0票数 2

我在路由实现中使用了Torory4.5.2。我的服务器有两个版本的API,让他们调用basefancy。因此,客户端可以同时使用它们:

代码语言:javascript
复制
GET /base/foo
GET /base/baz

GET /fancy/foo
GET /fancy/baz

但是,有些fancy处理程序可能无法实现;在这种情况下,应该使用base处理程序。

例如:

代码语言:javascript
复制
application = web.Application([
    (r"/base/foo",  handlers.BaseFooHandler,  {"some": "settings"}),
    (r"/base/baz",  handlers.BaseBazHandler,  {"some": "settings"}),
    (r"/fancy/foo", handlers.FancyFooHandler, {"some": "settings"}),
])

当cilent请求GET /fancy/baz时,BaseBazHandler应该完成这项工作。

我怎样才能通过龙卷风路由来实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2017-12-25 18:11:25

由于您使用装饰器注册您的路由,您可以创建一个自定义路由器,它将响应所有未匹配/未注册的/fancy/.*路由。要使它正确工作,您必须在的末尾注册路由器

这样,只有在还没有注册/fancy/...路由的情况下,才会匹配自定义路由器。因此,这意味着自定义路由器类需要执行以下操作:

  1. 检查是否存在后备BaseBazHandler
  2. 如果存在,请将请求转发给它。
  3. 否则,返回404错误。

在继续之前,您必须创建一个自定义类来处理404请求。这是必要的,因为如果没有找到处理程序,那么这是返回404错误的最简单方法。

代码语言:javascript
复制
class Handle404(RequestHandler):
    def get(self):
        self.set_status(404)
        self.write('404 Not Found')

好了,现在让我们编写自定义路由器:

代码语言:javascript
复制
from tornado.routing import Router

class MyRouter(Router):
    def __init__(self, app):
        self.app = app

    def find_handler(self, request, **kwargs):
        endpoint = request.path.split('/')[2] # last part of the path

        fallback_handler = 'Base%sHandler' % endpoint.title()
        # fallback_handler will look like this - 'BaseBazHandler'

        # now check if the handler exists in the current file
        try:
            handler = globals()[fallback_handler]
        except KeyError:
            handler = Handle404

        return self.app.get_handler_delegate(request, handler)

最后,在添加了所有其他路由之后,可以注册自定义路由器:

代码语言:javascript
复制
from tornado.routing import PathMatches

application.add_handlers(r'.*', # listen for all hosts
    [
        (PathMatches(r"/fancy/.*"), MyRouter(application)),
    ]
)

我应该指出,MyRouter.find_handler只检查当前模块(文件)中的处理程序。如果需要,修改代码以搜索不同模块中的处理程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47970574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档