[python] Tornado와 맞춤형 HTTP 요청 처리

Tornado는 Python으로 작성된 비동기 웹 프레임워크로, 고성능 HTTP 서버를 구축하기 위해 사용됩니다. Tornado는 이벤트 기반 아키텍처를 통해 많은 동시 연결을 처리할 수 있으며, 비동기 처리를 통해 확장성과 성능을 개선할 수 있습니다.

하지만 기본적인 Tornado의 HTTP 요청 처리 방식은 모든 요청에 대해 동일한 처리 로직을 적용하게 되기 때문에, 맞춤형 요청 처리가 필요한 경우에는 추가 작업이 필요합니다. 이번 글에서는 Tornado를 사용하여 맞춤형 HTTP 요청을 처리하는 방법에 대해 알아보겠습니다.

RequestHandler 상속

Tornado에서 HTTP 요청을 처리하기 위해 사용되는 주요 클래스는 tornado.web.RequestHandler입니다. 이 클래스를 상속하여 새로운 요청 처리 클래스를 만들 수 있습니다.

import tornado.web

class CustomRequestHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("This is a custom request handler.")

위의 예제에서는 CustomRequestHandler라는 새로운 클래스를 만들고, HTTP GET 요청에 대해 “This is a custom request handler.”라는 응답을 반환하도록 정의하였습니다.

URL 패턴과의 매핑

Tornado는 URL 패턴과 요청 처리 클래스를 매핑하여 요청을 적절한 핸들러로 라우팅할 수 있습니다. 이를 위해서는 tornado.web.Application 클래스를 사용해야 합니다.

import tornado.web
import tornado.ioloop

class CustomRequestHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("This is a custom request handler.")

app = tornado.web.Application([
    (r"/custom", CustomRequestHandler),
])

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

위의 예제에서는 /custom URL에 대한 요청을 CustomRequestHandler로 라우팅하도록 정의하였습니다. 따라서, 웹 브라우저에서 http://localhost:8888/custom에 접속하면 “This is a custom request handler.”가 표시됩니다.

요청 처리 메소드

RequestHandler 클래스는 HTTP 메소드에 따라 다양한 메소드를 제공하여 요청을 처리할 수 있습니다. 아래는 일부 예시입니다.

import tornado.web
import tornado.ioloop

class CustomRequestHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("This is a GET request handler.")

    def post(self):
        self.write("This is a POST request handler.")

app = tornado.web.Application([
    (r"/custom", CustomRequestHandler),
])

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

위의 예제에서는 GET 메소드와 POST 메소드에 대한 처리를 각각 다르게 정의하였습니다. 따라서, 웹 브라우저에서 http://localhost:8888/custom에 GET 또는 POST 요청을 보낼 때 각각 다른 응답을 받을 수 있습니다.

요청 매개변수 접근

RequestHandler 클래스에서는 요청에 대한 매개변수에 접근할 수 있는 다양한 속성을 제공합니다.

import tornado.web
import tornado.ioloop

class CustomRequestHandler(tornado.web.RequestHandler):
    def get(self):
        name = self.get_argument("name")
        self.write(f"Hello, {name}!")

    def post(self):
        names = self.get_arguments("name")
        self.write(f"Hello, {', '.join(names)}!")

app = tornado.web.Application([
    (r"/custom", CustomRequestHandler),
])

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

위의 예제에서는 GET 메소드와 POST 메소드에서 각각 이름 매개변수를 가져와 화면에 출력합니다. 웹 브라우저에서 http://localhost:8888/custom?name=John에 접속하면 “Hello, John!”이 표시되고, POST 요청으로 name 매개변수를 전달할 때는 매개변수 값들을 콤마로 구분하여 출력합니다.

결론

Tornado를 사용하여 맞춤형 HTTP 요청을 처리하는 방법에 대해 알아보았습니다. RequestHandler 클래스를 상속하여 새로운 요청 처리 클래스를 만들고, URL 패턴과의 매핑을 설정하여 해당 URL로 들어오는 요청을 적절한 핸들러로 라우팅할 수 있습니다. 이러한 방법을 활용하여 Tornado를 사용하면 HTTP 요청을 기반으로 한 다양한 웹 애플리케이션을 개발할 수 있습니다.

참고 자료: