龙卷风路由到“基础”处理程序

问题描述 投票:0回答:1

我使用龙卷风4.5.2与路由实现。我的服务器有两个版本的API,让他们调用basefancy。所以客户端可以同时使用它们:

GET /base/foo
GET /base/baz

GET /fancy/foo
GET /fancy/baz

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

例如:

application = web.Application([
    (r"/base/foo",  handlers.BaseFooHandler,  {"some": "settings"}),
    (r"/base/baz",  handlers.BaseBazHandler,  {"some": "settings"}),
    (r"/fancy/foo", handlers.FancyFooHandler, {"some": "settings"}),
])

当客户要求qazxsw poi时,qazxsw poi应该做的工作。

如何通过龙卷风路由实现这一目标?

python routing tornado
1个回答
0
投票

由于您使用装饰器注册路线,因此您可以创建一个自定义路由器,以响应所有不匹配/未注册的GET /fancy/baz路由。为了使其正常工作,您必须在最后注册路由器。

这样,只有在尚未注册BaseBazHandler路由时才会匹配自定义路由器。所以,这意味着自定义路由器类需要做这些事情:

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

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

/fancy/...

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

BaseBazHandler

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

class Handle404(RequestHandler):
    def get(self):
        self.set_status(404)
        self.write('404 Not Found')

我应该指出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) ,只检查当前模块(文件)中的处理程序。如果需要,修改代码以在不同模块中搜索处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.