TigerCow.Door


최근 학교에서 데이터베이스 수업을 들으면서 실습을 진행하고 있습니다.

이번에 PHP에 관련된 내용을 공부하게 되어 관련 내용을 공부하면서 정리해서 포스팅하려합니다.

부족한 부분은 언제든지 댓글이나 이메일(doorbw@outlook.com)으로 피드백주시면 감사하겠습니다.


1. Web Server


php와 같은 것들을 server side script(technology) 라고 합니다.

한글로 한다면 서버 측면 언어(기술)라고 생각할 수 있기에 서버 측에서 동작하는 언어라고 할 수 있습니다.

서버(server)라는 개념안에는 Apache, PHP, MySQL 등이 있습니다.

그리고 클라이언트(client)는 서버(server)에게 요청을 하고, 서버는 클라이언트에게 응답 및 제공을 하게 되죠.



흔히들 사용하는 웹 브라우저는 웹 클라이언트로 볼 수 있습니다.

웹 브라우저에 도메인을 입력하면 웹 클라이언트는 웹 서버에 요청을 하게 됩니다.

그리고 그 요청에 대해서 응답하는 것이 웹 서버가 하는 일 입니다.

웹 브라우저에는 우리가 많이사용하는 크롬, IE, Firefox 등이 있습니다.

그리고 웹 서버에는 Apache, IIS, nginx 등이 있습니다.

다시 돌아와서 웹 클라이언트(웹 브라우저)가 요청을 하면 웹 서버가 응답 및 제공을 하게 되는데 이때 HTML을 제공하게 됩니다.

그런데 HTML은 정적인 문서입니다.

정적이다? 다시 말해서 HTML은 사람이 수작업으로 하나하나 만들어야 한다는 것입니다.

이 때문에 몇 가지 문제가 생기게 됩니다.

많은 변화들을 어떻게 반영할 것인가?

많은 것들을 어떻게 사람이 일일이 제작할 것인가? 등 입니다.

이러한 정적인 HTML에서 한계를 느끼면서 이것을 극복하고자 하는 움직임이 생겼고 그로인해 CGI(Common Gateway Interface)가 나왔습니다.

CGI 란 웹 서버와 PHP파일을 처리하는 PHP engine 사이의 통신할 수 있는 통신 규약입니다.

웹 서버가 처리할 수 없는 파일(ex. php, py, ...)을 처리할 수 있는 것(PHP engine, python, ... )에 전달합니다.

이때 그것이 가능하도록 하는 것이 CGI 입니다.


2. PHP


그 중 우리가 배울 PHP라는 것에 대해서 더 알아보도록 하겠습니다.

PHP는 Personal homepage tools의 줄임말로 시작해서 현재는 PHP:Hypertext preprocessor 라고 정의되어 있습니다.

여기서 Hypertext는 HTML이라고 생각하셔도 좋습니다. 과거에는 perl이라는 언어로 만들어졌지만 현재는 C언어로 대체되었습니다.

위에서 간략하게 알아보았지만 다시 확인해보면 PHP는 서버쪽에서 실행 되는 프로그래밍 언어입니다. 주로 HTML 코드를 프로그래밍적으로 생성하죠.


PHP의 장점으로는 무엇이 있을까요?

웹 개발에서 많이 사용되고 있는 php는 관련된 많은 기능을 제공합니다.

따라서 웹 개발에 최적화된 언어로써 과거부터 현재까지 많이 이용되고 있습니다.

또한 거의 모든 데이터베이스를 지원하고 현재 가장 많은 공개소프트웨어가 PHP로 만들어져 있습니다.


PHP를 초보자에게 많이 쉽고 전문가에게는 많은 기능을 제공하기 때문에 많이 이용하기도 합니다.


PHP를 설치하는데  있어서는 아래 URL을 참고하시길 바랍니다. (우분투 기준)

http://imitator.kr/Linux/1078


이후 포스팅부터는 직접적인 실습을 진행하며 정리해보도록 하겠습니다.




블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요


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

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요