Получение Tornado для возврата HTTP 400 по всем неиспользованным URL
Можно ли настроить сервер Tornado для работы на определенном порту, активно обслуживать API по нескольким URL-адресам и возвращать ему HTTP 400: Bad request
на любой другой URL, запрашиваемый на этом порту?
Скажем, например, что у меня есть простой GET и POST API, работающий на http://example.com:1234/get
а также http://example.com:1234/post
соответственно, что возвращение 2xx
статусы в зависимости от обстоятельств, но просит http://example.com:1234/someRandomUrlRequest
вернуть HTTP 400
,
1 ответ
Решение
Поместите универсальный URL-маршрут в конец списка маршрутов вашего приложения. Создайте обработчик для этого универсального маршрута, который вызывает HTTPError(400) для запросов GET и POST. Вот пример:
import tornado.ioloop
import tornado.web
class GetHandler(tornado.web.RequestHandler):
def get(self):
self.write("GetHandler\n")
class PostHandler(tornado.web.RequestHandler):
def post(self):
self.write("PostHandler\n")
class BadRequestHandler(tornado.web.RequestHandler):
def get(self):
raise tornado.web.HTTPError(400)
post = get
application = tornado.web.Application([
(r"/get", GetHandler),
(r"/post", PostHandler),
(r"/.*", BadRequestHandler),
])
if __name__ == "__main__":
application.listen(1234)
tornado.ioloop.IOLoop.instance().start()
Тестирование с помощью curl:
$ curl localhost:1234/get
GetHandler
$ curl --data 'foo' localhost:1234/post
PostHandler
$ curl localhost:1234
<html><title>400: Bad Request</title><body>400: Bad Request</body></html>
$ curl localhost:1234/adsf
<html><title>400: Bad Request</title><body>400: Bad Request</body></html>
$ curl --data 'foo' localhost:1234/adsf
<html><title>400: Bad Request</title><body>400: Bad Request</body></html>