#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 для всех ошибок — больше проблем, чем пользы.