Как отправить запрос DELETE с двумя аргументами в пути? - PullRequest
2 голосов
/ 23 мая 2019

Я пытаюсь реализовать запрос DELETE, который получает 2 аргумента в пути. Один для mission_id и один для virtual_obj_id. Мой клиентский разработчик попытался использовать этот вызов API через React в Google Chrome и обнаружил, что запрос параметров не выполняется. Я воспроизвел эту проблему при попытке использовать тот же URL в запросе OPTIONS от Почтальона.

это вызов API:

(r'/mission/(.+)/virtual_obj/(.+)/$', VirtualObjectRemovalHandler),

Мой обработчик запросов знает, как обработать запрос:

class VirtualObjectRemovalHandler(MobileBaseHandler):

@tornado.gen.coroutine
def delete(self, mission_id, virtual_obj_id=None):
    //some code

мой базовый обработчик определяет Options () следующим образом:

    def options(self, argument=None):
    # no body
    self.set_status(204)
    self.finish()

Предварительная проверка завершается неудачно, поскольку объявляется слишком много аргументов. как это:

TypeError: options () принимает от 1 до 2 позиционных аргументов, но было дано 3 ОШИБКА: tornado.access: 500 ВАРИАНТОВ / миссия / f6a5fba0-7c7d-11e9-8123-e9c9137fe017 / virtual_obj / kjvsslbj /

Я использую торнадо 4.5.3 и python 3.6.3.
При тестировании этого на localhost, очевидно, все работает. Проблема заключается в предпечатной проверке CORS. Я также разрешаю заголовки на сервере:

    def set_default_headers(self):
    print ("setting headers!!!")
    self.set_header("Access-Control-Allow-Origin", "*")
    self.set_header("Access-Control-Allow-Headers", "*")
    self.set_header('Access-Control-Allow-Methods', 'POST, GET, 
    OPTIONS, DELETE')

Я пытался заглянуть в их документацию , но там нет никакой подсказки. Я могу добавить тело JSON, если мне нужно, но я стремлюсь к как можно меньшему количеству запросов. Разве торнадо просто не допускает более одного аргумента в пути запроса?

Что я здесь не так делаю?

1 Ответ

2 голосов
/ 24 мая 2019

Это проблематично:

def options(self, argument=None):
    ...

Вы хотите принять произвольное количество аргументов. В этом случае вам придется использовать синтаксис *.

def options(self, *args):
    ...

См. Это обсуждение для некоторых объяснений: Что ** (двойная звезда / звездочка) и * (звездочка / звездочка) делают для параметров?

...