TigerCow.Door


Tornado (python web server) 관련 3번째 포스팅입니다. 

이번 포스팅에서 다뤄볼 내용은 토네이도에서 템플릿 사용하기(Using template in Tornado) 입니다.

바로 시작해보도록 하겠습니다.


Tornado 에서는 python에서 사용할 수 있는 어떠한 템플릿 언어도 사용할 수 있습니다.

Tornado는 다른 템플릿 언어들에 비해 매우 빠르고 유연한 템플릿 언어를 기본적으로 포함하고 있다고 합니다.

자세한 내용은 Tornado의 template 모듈 문서를 참조하시면 됩니다.

http://www.tornadoweb.org/en/stable/_modules/tornado/template.html?highlight=template )


Tornado 템플릿은 마크업 언어 내에 python의 제어문과 표현식을 포함하고 있는 HTML 입니다.

아래 예제를 통해 확인해보도록 하겠습니다.

먼저 HTML 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
<html>   
 <head>       
  <title>{{ title }}</title>    
 </head>   
 <body>     
  <ul>        
   {% for item in items %}          
    <li>{{ escape(item) }}</li>        
   {% end %}      
  </ul>    
 </body
</html>
cs


위의 코드를 저는 template_test.html 으로 저장하고 tornado로 구동시킬 python파일과 같은 디텍토리에 넣었습니다.

7번 라인과 9번 라인은 python의 제어문을 표현한 것인데 밑에서 설명하도록 하겠습니다.

그리고 아래 python 코드를 통해 위의 템플릿을 rendering 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import tornado.httpserver
import tornado.ioloop
import tornado.web
 
class MainHandler(tornado.web.RequestHandler):     
     def get(self):         
          items = ["Item 1""Item 2""Item 3"]                  
          self.render("template_test.html", title="My title", items=items) 
 
application = tornado.web.Application([     
     (r"/", MainHandler),   
]) 
 
if __name__ == "__main__":     
     http_server = tornado.httpserver.HTTPServer(application)     
     http_server.listen(8888)     
     tornado.ioloop.IOLoop.instance().start()
cs


그리고 해당 python 파일을 구동시켜서 확인합니다.

제대로 랜더링이 되었다면 아래 사진과 같은 결과를 확인할 수 있습니다.




Tornado template 는 python의 제어문과 표현식을 함께 지원한다고 하였습니다.

제어문은 {% 와 %} 로 묶어 주면됩니다.

다시 위와 동일한 HTML 코드를 확인하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
<html>   
 <head>       
  <title>{{ title }}</title>    
 </head>   
 <body>     
  <ul>        
   {% for item in items %}          
    <li>{{ escape(item) }}</li>        
   {% end %}      
  </ul>    
 </body
</html>
cs


위에서 언급하였듯이 7번 라인 ~ 9번 라인을 보시면 제어문이 사용됨을 알 수 있습니다.

그리고 제어문은 {% , %}으로 둘러쌓여 있습니다.


제어문은 python의 제어문과 동일합니다.

Tornado 에서는 if, for, while, try를 지원하지만 모두 {% end %} 로 끝내주어야 합니다.

또한 extends 와 block 문을 이용하여 템플릿 상속(template inheritance)를 지원합니다.


표현식은 함수 호출을 포함한 어떤 python 표현식이나 가능합니다.

'escape() <.xhtml_escape>', '.url_escape()', '.json_encode()', '.squeeze()' 함수는 default 로 제공하고 있습니다.

또한 다른 함수를 템플릿에 넘겨주는 것 또한

템플릿 렌더 함수에게 함수 이름을 keyword argument로 넘겨주기만 하면 가능합니다.


아래 예제를 확인해보겠습니다.

먼저 python 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import tornado.httpserver
import tornado.ioloop
import tornado.web
 
class MainHandler(tornado.web.RequestHandler):     
     def get(self):         
          items = ["Item 1""Item 2""Item 3"]                  
          self.render("template_test.html", title="My title", items=items, sayHello=self.sayHello) 
 
     def sayHello(self, name):
          return 'Hello, '+name + '!!!'
 
application = tornado.web.Application([     
     (r"/", MainHandler),   
]) 
 
if __name__ == "__main__":     
     http_server = tornado.httpserver.HTTPServer(application)     
     http_server.listen(8888)     
     tornado.ioloop.IOLoop.instance().start()
cs


그리고 HTML 파일 코드 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>   
 <head>       
  <title>{{ title }}</title>    
 </head>   
 <body>     
  <ul>        
   {% for item in items %}          
    <li>{{ escape(item) }}</li>        
   {% end %}
   <p>
       {{ sayHello('DoorBW') }}
   </p>      
  </ul>    
 </body
</html>
cs


먼저 python 파일을 보시면 10번 라인에 sayHello 라는 이름의 함수가 새로 선언되었습니다.

name 이라는 인자를 받아서, Hello, name !!! 을 출력하도록 하는 함수입니다.

그리고 랜더링 시에 sayHello = self.sayHello 를 통해 sayHello 라는 이름으로 함수를 전달합니다.


HTML 파일을 확인하시면 11번 라인이 추가되었음을 확인할 수 있습니다.

sayHello라는 이름으로 함수를 받았기에 {{ sayHello('DoorBW') }} 라는 식으로 함수를 사용합니다.


실행결과는 아래와 같습니다.


내부에서 Tornado 템플릿은 python으로 직접 번역됩니다.

템플릿에 포함된 표현식은 템플릿을 나타내는 python 함수로 글자 그대로가 복사됩니다.

다른 말로 템플릿 표현식에서 이상한 내용을 쓴다면?

당연히 그 템플릿을 실행할 떄 이상한 python에러를 접할 것 입니다.


실제로 어플리케이션을 제작할 떄, Tornado 템플릿의 모든 기능, 특히 템플릿 상속 기능을 원활하게 사용하기위해

Tornado 공식 문서에서 template module 섹션에 대한 내용을 모두 읽어보시는 것을 추천드립니다.

위 예제에서 다룬 것은 극히 일부이며 공식문서에서 보다 많은 내용들을 참고하실 수 있습니다.



이렇게 해서 파이썬 웹서버 토네이도에서 템플릿 사용하는 방법에 대해 간략히 알아보았습니다.

다음에는 Cookies(쿠키)에 관한 내용에 대해 알아보도록 하겠습니다.









블로그 이미지

Tigercow.Door

Back-end / Python / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요