将两个网址路由到一个处理器

2 投票
2 回答
1702 浏览
提问于 2025-04-17 04:47

我正在尝试在Tornado上实现某种API,遇到了一个问题:是否可以将两个网址路由到同一个处理程序,并通过请求方法来区分。

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 个回答

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
]

任何访问第一个网址或者请求第二个网址的人都会收到一个“方法不支持”的错误提示。

3

实现你想做的事情的一种方法是使用正则表达式(regex)在你的网址中,并在你的方法处理器中检查这个属性。

下面是一些要映射的网址示例

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'的选项映射到一个字典里,这样可以让事情更清晰,也避免我在需要更改这些值或者想添加新网址时,必须深入到处理器里去。

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

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

撰写回答