0%

Django 웹 라이브러리 - (2) http

http ?

  • HTTP 프로토콜 처리와 관련하여 urllib 모듈로는 쉽게 처리할 수 없거나, urllib 모듈을 사용하는 것보다 좀 더 세밀한 클라이언트 기능을 사용할 수 있습니다

http.client

  • urllib.request 모듈로는 쉽게 처리할 수 없는 경우, 또는 HTTP 프로토콜 요청에 대한 저수준의 더 세밀한 기능이 필요할 때 이용됩니다.
  • urllib.request 모듈로 작성한 로직과 동일하게 사용할 수 있는데, 이는 urllib.request 모듈이 http.client 모듈에서 제공하는 API를 사용해서 만든 모듈이기 때문입니다.

GET 사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from http.client import HTTPConnection

# 1. 연결 객체 생성
'''
주의) 인자값으로 URL를 입력하는 것이 아니라, host 주소 자체를 입력해야한다.
따라서, 프로토콜(http://) 입력시 오류가 발생된다.
'''
conn = HTTPConnection("www.python.org")

# 2. 요청을 보냄
conn.request("GET", "/index.html")

# 3. 응답 객체 생성
response = conn.getresponse()

# 4. 응답 데이터를 읽음
data = response.read()

# 5. 연결을 닫음
conn.close()

POST 사용 예제

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
from http.client import HTTPConnection
from urllib.parse import urlencode

# 연결 호스트 지정
host = '127.0.0.1:8000'

# 요청 파라미터에 대해 URL 인코딩을 해야한다.
params = urlencode({
'language':'python',
'account':'wgtech'
})

# POST 요청으로 보낼 헤더 정보를 삽입
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'text/plain'
}

# 연결 시작
conn = HTTPConnection(host)
conn.request('POST', '', params, headers) # 반드시 POST로 명시해야한다.
response = conn.getresponse()
print(response.status, response.reason) # 200, Success

data = response.read()
print(data.decode('utf-8')) # response 인스턴스를 UTF-8 인코딩으로 불러온다.

# 연결 해제
conn.close()

HEAD 사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from http.client import HTTPConnection

# HTTPConnection 인스턴스 생성
conn = HTTPConnection('www.example.com')

# HEAD 방식임을 명시적으로 작성해야한다.
conn.request('HEAD', '/')

# 응답 결과 출력
response = conn.getresponse()
data = response.read()

# 출력 결과
print(len(data)) # 0
print(data == b'') # True

http.server

  • http.server 모듈을 통해 간단하게 웹 서버를 구성할 수 있습니다.

웹 서버 생성 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from http.server import HTTPServer, BaseHTTPRequestHandler

# 원하는 로직에 맞게 핸들러 클래스 정의하기
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self): # GET 일 때
self.send_response_only(200, 'OK')
self.end_headers()
self.wfile.write("Hello World")

if __name__ == '__main__': # 초기 실행되는 코드
server = HTTPServer(('', 8888), MyHandler)
print("Started WebServer on Port 8888")
print("Press ^C to Quit WebServer.")
server.serve_forever

Tip

명령어로 Django 웹 서버 간단하게 동작하기

1
2
3
4
5
6
7
8
# manage.py 가 있는 저장소 루트 (<repository-root>) 디렉토리에서

python runserver 0.0.0.0:8888
# 0.0.0.0 : 모든 주소로부터 접속이 가능하도록합니다. (127.0.0.1 이 기본값입니다)
# :8888 : 포트 번호 (8000 포트가 기본값입니다)

python -m http.server 8888
# 0.0.0.0:8888 로 바인딩시켜 웹 서버를 생성한 것과 동일한 결과입니다.

웹 서버 구동을 위한 Python 라이브러리 주요 클래스

HTTPServer

  • 웹 서버를 만들기 위한 가장 기초적인 클래스, 서버 IP와 Port 번호를 바인딩합니다
  • HTTPServer 객체 생성시, 핸들러 클래스를 별도로 정의해야합니다.

BaseHTTPRequestHandler

  • 핸들러를 만들기 위한 기반 클래스로, HTTP 프로토콜 처리 로직이 들어있습니다.
  • 이 클래스를 상속받아, 자신의 로직 처리를 담당하는 핸들러 클래스를 만듭니다.

SimpleHTTPRequestHandler

  • BaseHTTPRequestHandler 클래스를 상속받아 만든 클래스입니다.
  • GET과 HEAD 처리가 가능한 핸들러 클래스입니다.

CGIHTTPReqeustHandler

  • SimpleHTTPRequestHandler 클래스를 상속받아 만든 클래스입니다.
  • 추가적으로 POST 메서드와 CGI 처리가 가능한 핸들러 클래스입니다.

그 이외로 http.cookiejar 등이 있습니다.


참고) 파이썬 웹 프로그래밍(한빛미디어)