지원하는 모듈로 구성. - httplib(http.client) : 저수준의 클라이언트 모듈 => urllib - http.server 모듈 : HTTP 서버를 구현하는데 필요한 다양한 클래스 제공 - http.server => BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer
웹서버의 기능을 만드는데 기반으로 사용 - SocketServer.TCPServer 의 서브 클래스 - SocketServer.BaseServer 인터페이스 구현해야한다. - HTTP 소켓을 열고 기다리고, 요청을 오면 handler 로 dispatch - 서버로 부터 온 HTTP 요청 처리를 담당. - 이 클래스 자체에서 처리 X, 서브 클래스 작성해서 각각의 HTTP method 별로 처리 - 서브 클래싱을 위한 여러가지 함수와 변수를 제공. - 요청과 헤더를 파싱 그에 따른 메소드를 호출. BaseHTTPServer 4 HTTPServer(server_address, RequestHandlerClass) BaseHTTPReqeustHandler(request, client_address, server)
port) command : HTTP method, GET, POST, PUT HEAD, DELETE path : 요청경로 request_version : HTTP 버전 headers : HTTP Header rfile : 추가 입력 데이터를 읽기 위한 입력 스트림, 만약 클라이언트가 데이터 업로드를 했다면, rfile 을 통해서 받아올수 있다. wfile : 클라이언트로 응답 쓰기를 위한 출력 스트림
요청에 대한 응답 보내기, code 는 HTTP 상태코드 - error_meesage_format 을 이용해서 에러응답을 보냄. send_response(code [, message]) - 성공한 요청에 대한 응답 보내기 - 응답줄을 보내고 그 다음으로 Server, Date 헤더를 전송 send_header(keyword, value) - 헤더 쓰기, send_response() 를 호출한 다음에 호출해야 함. end_headers() - 헤더의 끝을 알리는 빈줄을 보낸다.
디렉토리와 그 하위의 디렉토리 파일 제공 - HEAD 와 GET 메서드만 제공 - 모든 IOError 예외는 404 File not found 에러 발생 - 일종의 정적 웹 서버를 만들어 준다. - 커스텀 하기 위해서는 서브 클래싱해서 사용. SimpleHTTPServer.SimpleHTTPRequestHandler(request, client_address, server)
현재 디렉토리와 그 하위의 디렉토리 파일 제공 - HEAD 와 GET, POST 메서드만 제공 - HTTP redirect(302) 지원하지 않는다. - 간단한 CGI 응용 프로그램을 위해서만 사용. 기본 GCI 디렉토리 : ‘/cgi-bin’, ‘htbin’ 기본 디렉토리 변경 : handler = CGIHTTPServer.CGIHTTPRequestHandler handler.cgi_directories = ["/"]
Gateway Interface )란 무엇인가 ? - WSGI 는 web server와 파이썬으로 작성된 web application 또는 framework들간의 인터페이스 를 정의해 놓은 규칙. PEP333 왜 WSGI가 만들어지게 되었는가? - 파이썬 웹 Application 과 웹 서버 사이에서의 선택의 제한 문제 - A 라는 프레임워크를 사용하면, 아파치를 못쓴다? - 아파치를 연동하려고 하면, B Framework 를 못쓴다? - 그러면, 서로 통신하기 위한 인터페이스 스펙을 만들자. => WSGI
API 도 아니고, 프레임워크도 아니다. Interface Spec - 웹서버 와 파이썬 웹 어플리케이션간의 통신을 위한 Interface Spec - 그래서 웹 서버단과 웹 어플리케이션 단의 스펙이 각각 존재 - 웹 서버/프레임워크를 개발하지 않는 이상, WSGI 를 직접 개발할 일은 없다. - 그러나 이해는 필요. Client Web Server based WSGI Web Application based WSGI request request response response tornado apache Flask Django
여야 함. Callable Object(호출가능한 객체) - 함수, 멤버 메소드, 인스턴스.__call__() 조건 : 1. 두개의 파라미터를 가져야 한다. - 첫번째, CGI 변수와 유사한 값을 가지고 있는 dict 객체 - 두번째, CallBack 함수 2. list[Response Body(String)] 형을 반드시 리턴.
표준의 서버파트 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 구현체
구현 => BaseHTTPReqeustHandler 의 서브클래스 이용 do_method(requset) { 구현 } WSGI 는 서버-웹 어플간의 인터페이스 스펙 웹 프레임워크가 WSGI 기반인지 확인 웹 서버-WSGI 지원 모듈 확인 Apache => mod-wsgi ngix => uwsgi