将2个网址路由到1个处理程序

时间:2011-10-21 21:00:28

标签: python url-routing tornado

我正在尝试在龙卷风上实现某种API,我有这样的疑问: 是否可以将两个URL路由到一个按方法分隔的处理程序。

class Handler():
   def get(self):
       #only for the first url
   def post(self):
       #only for the secornd url
handlers = [
   (r"/url1",Handler), #only GET are allowed
   (r"/url2",Handler), #only POST are allowed
]

因此,如果有人试图将POST发送到第一个网址,他应该会看到错误消息

2 个答案:

答案 0 :(得分:6)

您可以使用@ ee_vin的答案来执行此操作。但是,在这种情况下,为什么不创建两个处理程序?它更简单:

class OneHandler():
   def get(self):
       #only for the first url

class TwoHandler():
   def post(self):
       #only for the second url

handlers = [
   (r"/url1",OneHandler), #only GET are allowed
   (r"/url2",TwoHandler), #only POST are allowed
]

任何发布到第一个网址或获取第二个网址的人都会得到一个不支持的方法错误。

答案 1 :(得分:3)

实现您想要做的事情的一种方法是在您的网址中使用正则表达式并检查方法处理程序中的属性。

要映射的网址示例

url_patterns = [
    # here we want to map url1 url2 and url
    (r"/url([1|2])/", OneAndTwoHandler),
]

相应处理程序的一个示例

class OneAndTwoHandler(CustomRequestHandler):
    def get(self, my_param, *args, **kwargs):
        if my_param == '2':
            raise HTTPError(405)
        # code for only the first url here...

    def post(self, entry, *args, **kwargs):
        if my_param == '1':
            raise HTTPError(405)
        # code for only the first url here...

我会将'my_param'选项映射到字典以保持清晰,并避免我潜入处理程序,如果我需要更改这些值或者我想添加新的URL。

my_dict_urls = {
    'get': (1,2,3,4),
    'post': (3,5)
}

if int(my_param) not in my_dict_urls.get('get'):
    # ...