我使用龙卷风4.5.2和路由实现。
我的服务器有两个版本的API,让他们拨打base
和fancy
。所以客户端可以同时使用它们:
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"}),
])
当无声请求GET /fancy/baz
BaseBazHandler
应该完成工作时。
如何通过龙卷风路由实现这一目标?
答案 0 :(得分:0)
由于您使用装饰器注册路线,因此您可以创建一个自定义路由器,以响应所有不匹配/未注册的/fancy/.*
路由。为了使其正常工作,您必须在末尾注册路由器 。
这样,只有在尚未注册/fancy/...
路由的情况下,您的自定义路由器才会匹配。因此,这意味着自定义路由器类需要执行以下操作:
BaseBazHandler
。在继续之前,您必须创建一个自定义类来处理404请求。这是必要的,因为如果找不到处理程序,那么这是返回404错误的最简单方法。
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)
最后,在您添加了所有其他路线后,您可以注册自定义路由器:
from tornado.routing import PathMatches
application.add_handlers(r'.*', # listen for all hosts
[
(PathMatches(r"/fancy/.*"), MyRouter(application)),
]
)
我应该指出MyRouter.find_handler
,只检查当前模块(文件)中的处理程序。如果需要,修改代码以在不同模块中搜索处理程序。