2013년 5월 9일 목요일

[python] BaseHTTPServer 웹 서버의 구현



웹 서버는 작동 원리를 이해하기 어렵지 않다:

  • 클라이언트(브라우저)가 웹서버와 접속을 하고 HTTP GET 혹은 POST 방식으로 request 를 전송한다 (요청하고자 하는 url(경로)와 쿠키 등 의 정보가 request에 포함된다)
  • 서버측에서는 전송된 request를 파징한다. (경로 (예. /some/file), 쿠키 등.) 그리고 HTTP 코드로 respond 를 전송하며 (404 코드 : 찾을 수 없음, 200 코드 : 완료) 웹 페이지의 내용도 전송한다 (html 소스, 이미지...)
브라우저
(HTTP 클라이언트)
GET /path/hello.html HTTP/1.1
Host: www.myserver.com
서버
(HTTP 서버)
--------->
HTTP/1.1 200 OK
Content-Type: text/html
<html><body>Hello, world !</body></html>
<---------

파이썬의 BaseHTTPServer 모듈을 사용하면 위의 프로세스를 쉽게 작성할 수 있다.
아래의 웹서버 소스는 http://localhost:8088/ 로 접속시 "Hello, world !" 를 출력하는 예제다.


#!/usr/bin/python
import BaseHTTPServer

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)            # 200 코드 : request 를 잘 받았다는 의미        
        self.send_header('Content-type','text/html')   # respond 헤더 추가
        self.end_headers()                          # respond 헤더의 끝을 추가 ( "\n\r" )
        self.wfile.write('<html><body>Hello, world !</body></html>')
        return

print "Listening on port 8088..."
server = BaseHTTPServer.HTTPServer(('', 8088), MyHandler)
server.serve_forever()
  • MyHandler  가 우리가 만들고자 하는 웹서버 응답 핸들러이며, 정해진 포트로  request가 들어온 경우 그에 대한 응답을 돌려 준다.
  • GET 방식의 request 만 처리한다 (do_GET).
  • 코드 200의 의미는 request를 잘 받았다는 뜻이다. (self.send_response(200)).
  • 헤더를 추가해서 브라우저에 request 를 전송한다고 알려준다 (self.send_header('Content-type','text/html')).
  • 그리고 HTML 소스 자체를 출력한다 (self.wfile.write(...))

댓글 없음:

댓글 쓰기