카테고리 없음

[Tornado] RequestHandler - 기타 요청 데이터 접근

비번변경 2024. 7. 16. 15:09

개요

2024.06.23-[Tornado] RequestHandler - Form 입력 처리에서는 Form을 통해 전달받은 데이터를 접근하는 방법에 대해서 알아보았다. 하지만 이번에 맡은 업무는 JSON 등으로 입력받을 예정이다. 따라서 Tornado 애플리케이션에서 이번 글에서는 Form 입력 데이터 이외의 다른 입력 데이터에 접근하는 방법을 적어둔다.

 

 

요청 메서드 접근

요청 메서드는 self.request.method 속성으로 사용할 수 있다.

class MainHandler(RequestHandler):
    def get(self):
        print(self.request.method)
        self.write(self.request.method)
        
def make_app():
    return Application([
        (r"/", MainHandler),
    ])

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

 

 

URI 파라미터 접근

URI로 전달된 파라미터(?key=value)에 접근할 때는 get_argument, get_arguments 함수 또는 self.request.arguments 속성을 사용한다.

class MainHandler(RequestHandler):
    def get(self):
        print(self.request.arguments)
        print(self.get_arguments('username'))
        print(self.get_argument('username'))
        self.write(self.get_argument('username'))
        
def make_app():
    return Application([
        (r"/users", MainHandler),
    ])

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

 

 

요청 body 접근

JSON 형식으로 전달된 요청 본문은 self.request.body 속성으로 접근할 수 있다. 다만 일반적으로 JSON 형식으로 변환하여 접근하는 것 같다. 요청 데이터 변환은 prepare 또는 post 함수 내에서 수행하면 된다. 아래 예시는 prepare 함수에서 변환하여 접근한 것이다.

from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
import json

class MainHandler(RequestHandler):
    def prepare(self):
        if self.request.headers.get("Content-Type", "").startswith("application/json"):
            self.json_args = json.loads(self.request.body)
        else:
            self.json_args = None

    def post(self):
        print(self.request.body, self.json_args)
        self.write(self.json_args)

def make_app():
    return Application([
        (r"/message", MainHandler)
    ])

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



요청 header 접근

요청의 Header 정보는 self.request.headers 속성으로 접근할 수 있다. header의 특정 속성에 접근할 때는 get 함수를 사용한다.

class MainHandler(RequestHandler):
    def post(self):
        print(self.request.headers)
        self.write(self.request.headers.get('Content-Type'))

def make_app():
    return Application([
        (r"/message", MainHandler)
    ])

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

 

 

참고 문서

https://www.tornadoweb.org/en/branch6.1/guide/structure.html