Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python Study 8 - Web Programming

Python Study 8 - Web Programming

AhnSeongHyun

May 18, 2015
Tweet

More Decks by AhnSeongHyun

Other Decks in Programming

Transcript

  1. http 패키지 3 HTTP 클라이언트와 서버를 작성하기 위한 모듈과 상태관리(쿠키)를

    지원하는 모듈로 구성. - httplib(http.client) : 저수준의 클라이언트 모듈 => urllib - http.server 모듈 : HTTP 서버를 구현하는데 필요한 다양한 클래스 제공 - http.server => BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer
  2. http 서버를 구현하기 위한 2개의 클래스로 구성 보통 직접사용하지 않고,

    웹서버의 기능을 만드는데 기반으로 사용 - SocketServer.TCPServer 의 서브 클래스 - SocketServer.BaseServer 인터페이스 구현해야한다. - HTTP 소켓을 열고 기다리고, 요청을 오면 handler 로 dispatch - 서버로 부터 온 HTTP 요청 처리를 담당. - 이 클래스 자체에서 처리 X, 서브 클래스 작성해서 각각의 HTTP method 별로 처리 - 서브 클래싱을 위한 여러가지 함수와 변수를 제공. - 요청과 헤더를 파싱 그에 따른 메소드를 호출. BaseHTTPServer 4 HTTPServer(server_address, RequestHandlerClass) BaseHTTPReqeustHandler(request, client_address, server)
  3. BaseHTTPServer 5 기본적인 형태 - ip, port 지정해서 서버 띄우기,

    서버요청 처리를 위한 핸들러 클래스 지정 - serve_forever() : shutdown() 호출될 때까지 요청을 처리한다.
  4. 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>
  5. BaseHTTPServerHandler 8  인스턴스 속성 client_address : 클라이언트 주소 (host,

    port) command : HTTP method, GET, POST, PUT HEAD, DELETE path : 요청경로 request_version : HTTP 버전 headers : HTTP Header rfile : 추가 입력 데이터를 읽기 위한 입력 스트림, 만약 클라이언트가 데이터 업로드를 했다면, rfile 을 통해서 받아올수 있다. wfile : 클라이언트로 응답 쓰기를 위한 출력 스트림
  6. 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() - 헤더의 끝을 알리는 빈줄을 보낸다.
  7. SimpleHTTPServer. SimpleHttpRequestHandler 13 SimpleHTTPServer 모듈은 SimpleHttpRequestHandler 가 전부. - 현재

    디렉토리와 그 하위의 디렉토리 파일 제공 - HEAD 와 GET 메서드만 제공 - 모든 IOError 예외는 404 File not found 에러 발생 - 일종의 정적 웹 서버를 만들어 준다. - 커스텀 하기 위해서는 서브 클래싱해서 사용. SimpleHTTPServer.SimpleHTTPRequestHandler(request, client_address, server)
  8. SimpleHTTPServer 14 simplehttpserver - sphttp.py - html - food -index.html

    - place -index.html  디렉토리내 index.html 이 있으면 디렉토리 접근시 index.html 불러와서 보여준다.
  9. CGIHTTPServer. CGIHTTPRequestHandler 15 - CGIHTTPServer 모듈은 CGIHttpRequestHandler 가 전부. -

    현재 디렉토리와 그 하위의 디렉토리 파일 제공 - HEAD 와 GET, POST 메서드만 제공 - HTTP redirect(302) 지원하지 않는다. - 간단한 CGI 응용 프로그램을 위해서만 사용. 기본 GCI 디렉토리 : ‘/cgi-bin’, ‘htbin’ 기본 디렉토리 변경 : handler = CGIHTTPServer.CGIHTTPRequestHandler handler.cgi_directories = ["/"]
  10. WSGI(Web Server Gateway Interface) 17  WSGI ( Web Server

    Gateway Interface )란 무엇인가 ? - WSGI 는 web server와 파이썬으로 작성된 web application 또는 framework들간의 인터페이스 를 정의해 놓은 규칙. PEP333  왜 WSGI가 만들어지게 되었는가? - 파이썬 웹 Application 과 웹 서버 사이에서의 선택의 제한 문제 - A 라는 프레임워크를 사용하면, 아파치를 못쓴다? - 아파치를 연동하려고 하면, B Framework 를 못쓴다? - 그러면, 서로 통신하기 위한 인터페이스 스펙을 만들자. => WSGI
  11. WSGI(Web Server Gateway Interface) 18 서버도 아니고, 파이썬 모듈도 아니고,

    API 도 아니고, 프레임워크도 아니다. Interface Spec - 웹서버 와 파이썬 웹 어플리케이션간의 통신을 위한 Interface Spec - 그래서 웹 서버단과 웹 어플리케이션 단의 스펙이 각각 존재 - 웹 서버/프레임워크를 개발하지 않는 이상, WSGI 를 직접 개발할 일은 없다. - 그러나 이해는 필요. Client Web Server based WSGI Web Application based WSGI request request response response tornado apache Flask Django
  12. WSGI Application Interface 19 WSGI Application Interface 는 Callable Object

    여야 함. Callable Object(호출가능한 객체) - 함수, 멤버 메소드, 인스턴스.__call__() 조건 : 1. 두개의 파라미터를 가져야 한다. - 첫번째, CGI 변수와 유사한 값을 가지고 있는 dict 객체 - 두번째, CallBack 함수 2. list[Response Body(String)] 형을 반드시 리턴.
  13. WSGI Application Interface 20 environ - 클라이언트가 서버에 요청을 보낼때

    마다, 서버에서 보내주는 정보 - http method, query ALLUSERSPROFILE: C:\ProgramData COMPUTERNAME: ¾È¼ºÇö COMSPEC: C:\Windows\system32\cmd.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 - 실제 반환하는 응답 데이터 - [문자열] 형태로 반환  가장 기본적인 형태
  14. WSGI Middleware 23 WSGI Application – HTTP 요청을 처리 WSGI

    Middleware - WSGI Application 전후의 처리 혹은 environ 의 확장 - PEP333 에 특별한 명세는 없음. 가이드만.
  15. flask-tornado 27 tornado/wsgi.py/class WSGIContainer request – tornado 서버를 통해서 들어온

    HTTP 요청에 해당하는 tornado.HTTPRequest 객체 WSGIContainer.envrion – 내부의 값을 WSGI environ 에 필요한 형식으로 맞추는 작업
  16. 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
  17. 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 구현체
  18. wsgiref 31  wgsiref.validator(app) - WSGI 응용프로그램을 감싸는 새로운 WSGI

    응용 프로그램 생성 - 새로운 응용프로그램에서 감싼 대상이 WSGI 표준에 맞는지 검사하고 실행. - 위반 사항이 있으면 AssertionError 예외 발생
  19. 정리 32 정적 웹 서버 => SimpleHTTPRequestServerHandler 모든 HTTP methods

    구현 => BaseHTTPReqeustHandler 의 서브클래스 이용 do_method(requset) { 구현 } WSGI 는 서버-웹 어플간의 인터페이스 스펙 웹 프레임워크가 WSGI 기반인지 확인 웹 서버-WSGI 지원 모듈 확인 Apache => mod-wsgi ngix => uwsgi