티스토리 뷰

Python

Python, 웹 서버 만들기

hwangyoungjae 2016. 5. 25. 18:41
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

HTTPServer서버 객체를 생성시 핸들을 지정해준다

핸들은 BaseHTTPRequestHandler http의 기본적인 응답을 할수 있는 기능들이 들어있다.

class http.server.HTTPServer((server_address,port),RequestHandlerClass)

serve_forever()메서드를 실행하면 서버는 요청을 기다리게 된다.

그리고 요청이 들어오면 등록된 핸들러에 요청정보를 전달해준다.

아래예제는 http서버가 클라이언트에 어떻게 응답을 반환하는지어떻게 응답을 만드는데 유용한 지역요소를 포함하는지 보여준다.

import http.server

from urllib.parse import urlparse

 

class MyHandler(http.server.BaseHTTPRequestHandler):

    def do_GET(self):

        parsed_path=urlparse(self.path)

        message_parts=['Client address : {0:s}'.format(self.client_address),

                       'Client string : {0:s}'.format(self.address_string()),

                       'Command : {0:s}'.format(self.command),

                       'Path : {0:s}'.format(self.path),

                       'real path : {0:s}'.format(parsed_path.path),

                       'query : {0:s}'.format(parsed_path.query),

                       'request version : {0:s}'.format(self.request_version),

                       'server_version : {0:s}'.format(self.server_version),

                       'sys_version : {0:s}'.format(self.sys_version),

                       'protocol_version : {0:s}'.format(self.protocol_version)]

        message='<br>'.join(message_parts)

        self.send_response(200) #응답코드

        self.end_headers() #헤더가 본문을 구분

        self.wfile.write(message.encode('utf-8'))

        return None

 

s=http.server.HTTPServer(('localhost',8080),MyHandler)

s.serve_forever()

MyHandler클래스는 BaseHTTPRequestHandler를 상속받은 클래스이다.

do_GET()메서드는 BaseHTTPRequestHandler클래스의 do_GET()메서드를 오버라이딩 한것으로 http GET요청이 들어오면 이 함수가 호출된다.

HTTP프로토콜을 이용해 클라이언트가 서버에게 요청을 하거나 서버가 클라이언트에게 응답을 할때주고받는 문서는 헤더와 본문 두 부분으로 나눌수 있다.

이때 사용하는 메서드가 end_headers()이다, end_headers() 이전의 출력은 헤더로 이후의 출력은 본문이 된다만약 end_headers()를 쓰지 않으면 본문 부분이 몽땅 헤더부분에 들어가게 되기 때문에 에러가 발생한다.

메시지 텍스트는 구성된후 응답소켓을 감싸는 파일 핸들 wfile에 기록된다.

각 응답은 응답코드를 필요로 하고 send_response()로 설정한다.

에러코드(404,501 )가 사용되면 적절한 에러 메시지가 헤더에 포함되있다.

혹은 에러코드와 함꼐 메시지를 전달할수도 있다.

웹브라우저의 주소창에 http://localhost:8080/?foo=bar 주소를 치면 아래와 같이 출력된다.

Client address : ('127.0.0.1', 4418)

Client string : localhost

Command : GET

Path : /?foo=bar

real path : /

query : foo=bar

request version : HTTP/1.1

server_version : BaseHTTP/0.6

sys_version : Python/3.2.2

protocol_version : HTTP/1.0

 

참조 : 빠르게 활용하는 파이썬프로그래밍

참조 : The Python Standard Library by Example

'Python' 카테고리의 다른 글

Python,module pydoc [도움말]  (0) 2016.05.25
Python,module unittest [단위테스트]  (0) 2016.05.25
Python, 네이버검색 OpenAPI이용하기  (0) 2016.05.24
Python,module socket [소켓통신]  (0) 2016.05.24
Python, 이메일보내기  (0) 2016.05.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함