Преобразовать возврат Tornado html в данные json

#tornado

#tornado

Вопрос:

У меня есть простое приложение tornado, которое возвращает Hello World для запросов get, но если метод POST / PUT / DELETE … он возвращает HTML-ответ следующим образом:

 <html>
<title>405: Method Not Allowed</title>

<body>405: Method Not Allowed</body>

</html> 
 

Я хочу, чтобы ответ был таким:

 { "error":"Method not allowed }
 

Итак, мой вопрос: есть ли способ вернуть ответ json вместо html. Ниже приведен код, который я написал до сих пор (я добавил заголовок set, но он просто возвращает те же данные html, что и выше, но в формате json (я хочу вернуть конкретные данные json) итак, есть ли способ сделать это?

 import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def set_default_headers(self):
      self.set_header('Content-Type', 'application/json')

    def get(self):
        self.write("Hello, world")

class SecondHandler(tornado.web.RequestHandler):
    def get(self, two):
        self.write("Hello, worldddd")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
        (r"/", SecondHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
 

Спасибо

Ответ №1:

Метод переопределения для этого RequestHandler.write_error .

 def write_error(self, status_code, **kwargs):
    if status_code == 405:
        self.finish({"error": "Method not allowed"})
    else:
        super().write_error(status_code, **kwargs)
 

Но я бы посоветовал вам сделать так, чтобы ваш клиентский код мог просматривать код состояния независимо от того, есть ли тело ответа в формате json или нет. Отследить все возможные пути 404 (etc) для выдачи ответов в формате json для всех ошибок — больше проблем, чем пользы.