маршрутизация 2 URL на 1 обработчик - PullRequest
2 голосов
/ 22 октября 2011

Я пытаюсь реализовать какой-то 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 к первому URL он должен увидеть сообщение об ошибке

Ответы [ 2 ]

6 голосов
/ 23 октября 2011

Вы можете использовать ответ @ 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
]

Любой, кто публикует первый URL или получает второй, получит метод, который не поддерживается.

3 голосов
/ 05 ноября 2011

Один из способов добиться того, что вы хотите сделать, это использовать регулярные выражения в вашем URL и проверить атрибут в вашем обработчике методов.

Пример URL для отображения

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'):
    # ...
...