Объясняя ошибку :
Этот маршрут (r"/api/cars/?", CarHandler)
указывает на CarHandler, но не передает аргументов методам обработчика. Я считаю, что методы get и post определены следующим образом: def get(self):
, поэтому им действительно не нужно никаких аргументов; С другой стороны, методы put и delete определены как def put(self, carId):
, поэтому им необходимо получить аргумент. По этой причине вы получили ошибку:
Error: TypeError: put() missing 1 required positional argument:
Точно так же, (r"/api/cars/[0-9]/?", CarHandler)
тоже не передает аргументов.
Исправление ошибки маршрута :
Во-первых, как объяснил другой член, вам нужно исправить (r"/api/cars/[0-9]/?", CarHandler)
, чтобы передать аргумент вашим методам. Вы можете сделать это, просто набрав (
и )
в вашем маршруте. Должно быть так: (r"/api/cars/([0-9])/?", CarHandler)
.
Исправление ошибки определения метода :
Вы можете видеть, что даже если вы делаете то, что я сказал, вы, вероятно, все еще получаете ту же ошибку. Проблема в том, что все маршруты указаны для всех методов в обработчике. Таким образом, методы обработчика должны иметь одинаковую сигнатуру метода, или они должны иметь возможность вызываться одинаково.
Этот момент немного хитрый. Методы PUT и DELETE ожидают получения carId , но не все маршруты передают carId в качестве аргумента ((r"/api/cars/?", CarHandler)
нет). Этот маршрут вызывает методы следующим образом: self.method()
; он будет работать с self.get()
или self.post()
, но не будет помещен или удален, если они ожидают аргумента. Вы можете исправить это, разделив ваш обработчик на две части или изменив определение метода на:
def delete(self, carId=None):
...
def put(self, carId=None):
...
И добавление некоторой логической проверки как if carId is None: return