3. http 패키지
3
HTTP 클라이언트와 서버를 작성하기 위한 모듈과 상태관리(쿠키)를 지원하는 모듈로 구성.
- httplib(http.client) : 저수준의 클라이언트 모듈 => urllib
- http.server 모듈 : HTTP 서버를 구현하는데 필요한 다양한 클래스 제공
- http.server => BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer
4. http 서버를 구현하기 위한 2개의 클래스로 구성
보통 직접사용하지 않고, 웹서버의 기능을 만드는데 기반으로 사용
- SocketServer.TCPServer 의 서브 클래스
- SocketServer.BaseServer 인터페이스 구현해야한다.
- HTTP 소켓을 열고 기다리고, 요청을 오면 handler 로 dispatch
- 서버로 부터 온 HTTP 요청 처리를 담당.
- 이 클래스 자체에서 처리 X, 서브 클래스 작성해서 각각의 HTTP method 별로 처리
- 서브 클래싱을 위한 여러가지 함수와 변수를 제공.
- 요청과 헤더를 파싱 그에 따른 메소드를 호출.
BaseHTTPServer
4
HTTPServer(server_address, RequestHandlerClass)
BaseHTTPReqeustHandler(request, client_address, server)
7. BaseHTTPServerHandler
7
클래스 변수
server_version
- 서버가 클라이언트에 보고할 서버의 소프트웨어 버전
sys_version
- 시스템 버전
error_message_fotmat
- 클라이언트에게 에러 발생시 보낼 포맷
protocol_version
- HTTP 프로토콜 버전
responses(message, explain)
- HTTP 에러 코드에대한 설명 맵핑
- 404 => (“Not Found”, “Nothing matches the given URI.”)
<head>
<title>Error response</title>
</head>
<body>
<h1>Error response</h1>
<p>Error code %(code)d.
<p>Message: %(message)s.
<p>Error code explanation: %(code)s = %(explain)s.
</body>
8. BaseHTTPServerHandler
8
인스턴스 속성
client_address : 클라이언트 주소 (host, port)
command : HTTP method, GET, POST, PUT HEAD, DELETE
path : 요청경로
request_version : HTTP 버전
headers : HTTP Header
rfile : 추가 입력 데이터를 읽기 위한 입력 스트림,
만약 클라이언트가 데이터 업로드를 했다면, rfile 을 통해서 받아올수 있다.
wfile : 클라이언트로 응답 쓰기를 위한 출력 스트림
10. BaseHTTPServerHandler
10
인스턴스 메소드
send_error(code [, message])
- 실패한 요청에 대한 응답 보내기, code 는 HTTP 상태코드
- error_meesage_format 을 이용해서 에러응답을 보냄.
send_response(code [, message])
- 성공한 요청에 대한 응답 보내기
- 응답줄을 보내고 그 다음으로 Server, Date 헤더를 전송
send_header(keyword, value)
- 헤더 쓰기, send_response() 를 호출한 다음에 호출해야 함.
end_headers()
- 헤더의 끝을 알리는 빈줄을 보낸다.
13. SimpleHTTPServer. SimpleHttpRequestHandler
13
SimpleHTTPServer 모듈은 SimpleHttpRequestHandler 가 전부.
- 현재 디렉토리와 그 하위의 디렉토리 파일 제공
- HEAD 와 GET 메서드만 제공
- 모든 IOError 예외는 404 File not found 에러 발생
- 일종의 정적 웹 서버를 만들어 준다.
- 커스텀 하기 위해서는 서브 클래싱해서 사용.
SimpleHTTPServer.SimpleHTTPRequestHandler(request, client_address, server)
15. CGIHTTPServer. CGIHTTPRequestHandler
15
- CGIHTTPServer 모듈은 CGIHttpRequestHandler 가 전부.
- 현재 디렉토리와 그 하위의 디렉토리 파일 제공
- HEAD 와 GET, POST 메서드만 제공
- HTTP redirect(302) 지원하지 않는다.
- 간단한 CGI 응용 프로그램을 위해서만 사용.
기본 GCI 디렉토리 : ‘/cgi-bin’, ‘htbin’
기본 디렉토리 변경 :
handler = CGIHTTPServer.CGIHTTPRequestHandler
handler.cgi_directories = ["/"]
17. WSGI(Web Server Gateway Interface)
17
WSGI ( Web Server Gateway Interface )란 무엇인가 ?
- WSGI 는 web server와 파이썬으로 작성된 web application 또는 framework들간의 인터페이스
를 정의해 놓은 규칙. PEP333
왜 WSGI가 만들어지게 되었는가?
- 파이썬 웹 Application 과 웹 서버 사이에서의 선택의 제한 문제
- A 라는 프레임워크를 사용하면, 아파치를 못쓴다?
- 아파치를 연동하려고 하면, B Framework 를 못쓴다?
- 그러면, 서로 통신하기 위한 인터페이스 스펙을 만들자. => WSGI
18. WSGI(Web Server Gateway Interface)
18
서버도 아니고, 파이썬 모듈도 아니고, API 도 아니고, 프레임워크도 아니다.
Interface Spec
- 웹서버 와 파이썬 웹 어플리케이션간의 통신을 위한 Interface Spec
- 그래서 웹 서버단과 웹 어플리케이션 단의 스펙이 각각 존재
- 웹 서버/프레임워크를 개발하지 않는 이상, WSGI 를 직접 개발할 일은 없다.
- 그러나 이해는 필요.
Client
Web Server
based WSGI
Web Application
based WSGI
request request
responseresponse
tornado
apache
Flask
Django
19. WSGI Application Interface
19
WSGI Application Interface 는 Callable Object 여야 함.
Callable Object(호출가능한 객체)
- 함수, 멤버 메소드, 인스턴스.__call__()
조건 :
1. 두개의 파라미터를 가져야 한다.
- 첫번째, CGI 변수와 유사한 값을 가지고 있는 dict 객체
- 두번째, CallBack 함수
2. list[Response Body(String)] 형을 반드시 리턴.
20. WSGI Application Interface
20
environ
- 클라이언트가 서버에 요청을 보낼때 마다, 서버에서 보내주는 정보
- http method, query
ALLUSERSPROFILE: C:ProgramData
COMPUTERNAME: ¾È¼ºÇö
COMSPEC: C:Windowssystem32cmd.exe
CONTENT_LENGTH:
CONTENT_TYPE: text/plain
HTTP_ACCEPT:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.
8
HTTP_ACCEPT_ENCODING: gzip,deflate,sdch
HTTP_ACCEPT_LANGUAGE: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
HTTP_CONNECTION: keep-alive
HTTP_HOST: localhost:8051
HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153
Safari/537.36
start_response(status, headers)
- 콜백함수
- status : HTTP 상태에 따른 문자열
- headers : 튜플리스트[(),()…]
response_body
- 실제 반환하는 응답 데이터
- [문자열] 형태로 반환
가장 기본적인 형태
28. flask-tornado
28
Client
Web Server
based WSGI
Web Application
based WSGI
localhost:8000
Tornado Flask
WSGIContainer.__call__
Flask.__call__
start_response
environ
[response]
HttpRequest.write(body)
tornado.httprequest
(environ, start_response)
WebBrowser
29. wsgiref
29
만든 WGSI 웹 App을 독립서버에서 테스트 할수 있게해주는WSGI 표준의 서버파트
wgsiref.simple_server 모듈
- 간단히 하나의 WSGI 기반의 독립 HTTP 서버를 구현한다.
make_server(host, port, app) 함수
- host:port 의 HTTP 서버 생성
- APP : WSGI Application Interface를 구현한 함수나 호출가능한 객체
- test_server.serve_forever()
demo_app(environ, start_response) 함수
- “Hello world” 메시지를 출력하는 페이지를 반환하는 WSGI Application Inteface 구현체
32. 정리
32
정적 웹 서버 => SimpleHTTPRequestServerHandler
모든 HTTP methods 구현 => BaseHTTPReqeustHandler 의 서브클래스 이용
do_method(requset) { 구현 }
WSGI 는 서버-웹 어플간의 인터페이스 스펙
웹 프레임워크가 WSGI 기반인지 확인
웹 서버-WSGI 지원 모듈 확인 Apache => mod-wsgi
ngix => uwsgi