Получение 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>
Другие вопросы по тегам