SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
안성현(@SH84AHN)
웹 관련 프로그래밍 2탄
서버 만들기, WSGI
1
오늘 다룰 것들.
2
http package
BaseHTTPServer/BaseHTTPServerHandler
SimpleHTTPServerHandler
HTTPServer
CGIHTTPServerHandler
WSGI/Application Interface/Middleware
wsgiref
http 패키지
3
HTTP 클라이언트와 서버를 작성하기 위한 모듈과 상태관리(쿠키)를 지원하는 모듈로 구성.
- httplib(http.client) : 저수준의 클라이언트 모듈 => urllib
- http.server 모듈 : HTTP 서버를 구현하는데 필요한 다양한 클래스 제공
- http.server => BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer
http 서버를 구현하기 위한 2개의 클래스로 구성
보통 직접사용하지 않고, 웹서버의 기능을 만드는데 기반으로 사용
- SocketServer.TCPServer 의 서브 클래스
- SocketServer.BaseServer 인터페이스 구현해야한다.
- HTTP 소켓을 열고 기다리고, 요청을 오면 handler 로 dispatch
- 서버로 부터 온 HTTP 요청 처리를 담당.
- 이 클래스 자체에서 처리 X, 서브 클래스 작성해서 각각의 HTTP method 별로 처리
- 서브 클래싱을 위한 여러가지 함수와 변수를 제공.
- 요청과 헤더를 파싱 그에 따른 메소드를 호출.
BaseHTTPServer
4
HTTPServer(server_address, RequestHandlerClass)
BaseHTTPReqeustHandler(request, client_address, server)
BaseHTTPServer
5
기본적인 형태
- ip, port 지정해서 서버 띄우기, 서버요청 처리를 위한 핸들러 클래스 지정
- serve_forever() : shutdown() 호출될 때까지 요청을 처리한다.
BaseHTTPServerHandler
6
 핸들러의 함수 맵핑
- do_METHOD()
- GET => do_GET()
- POST => do_POST()
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>
BaseHTTPServerHandler
8
 인스턴스 속성
client_address : 클라이언트 주소 (host, port)
command : HTTP method, GET, POST, PUT HEAD, DELETE
path : 요청경로
request_version : HTTP 버전
headers : HTTP Header
rfile : 추가 입력 데이터를 읽기 위한 입력 스트림,
만약 클라이언트가 데이터 업로드를 했다면, rfile 을 통해서 받아올수 있다.
wfile : 클라이언트로 응답 쓰기를 위한 출력 스트림
BaseHTTPServerHandler
9
인스턴스 변수 예제
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()
- 헤더의 끝을 알리는 빈줄을 보낸다.
BaseHTTPServerHandler
11
GET 으로 들어오는 요청을 처리해 보자.
- “/” => “/main” 으로 리다이렉트
BaseHTTPServerHandler
12
GET 으로 들어오는 요청을 처리해 보자
- “/person” => 404
- “/person?name=ash84&age=31” => json response
SimpleHTTPServer. SimpleHttpRequestHandler
13
SimpleHTTPServer 모듈은 SimpleHttpRequestHandler 가 전부.
- 현재 디렉토리와 그 하위의 디렉토리 파일 제공
- HEAD 와 GET 메서드만 제공
- 모든 IOError 예외는 404 File not found 에러 발생
- 일종의 정적 웹 서버를 만들어 준다.
- 커스텀 하기 위해서는 서브 클래싱해서 사용.
SimpleHTTPServer.SimpleHTTPRequestHandler(request, client_address, server)
SimpleHTTPServer
14
simplehttpserver
- sphttp.py
- html
- food
-index.html
- place
-index.html
 디렉토리내 index.html 이 있으면 디렉토리 접근시 index.html 불러와서 보여준다.
CGIHTTPServer. CGIHTTPRequestHandler
15
- CGIHTTPServer 모듈은 CGIHttpRequestHandler 가 전부.
- 현재 디렉토리와 그 하위의 디렉토리 파일 제공
- HEAD 와 GET, POST 메서드만 제공
- HTTP redirect(302) 지원하지 않는다.
- 간단한 CGI 응용 프로그램을 위해서만 사용.
기본 GCI 디렉토리 : ‘/cgi-bin’, ‘htbin’
기본 디렉토리 변경 :
handler = CGIHTTPServer.CGIHTTPRequestHandler
handler.cgi_directories = ["/"]
CGIHTTPServer
16
WSGI(Web Server Gateway Interface)
17
 WSGI ( Web Server Gateway Interface )란 무엇인가 ?
- WSGI 는 web server와 파이썬으로 작성된 web application 또는 framework들간의 인터페이스
를 정의해 놓은 규칙. PEP333
 왜 WSGI가 만들어지게 되었는가?
- 파이썬 웹 Application 과 웹 서버 사이에서의 선택의 제한 문제
- A 라는 프레임워크를 사용하면, 아파치를 못쓴다?
- 아파치를 연동하려고 하면, B Framework 를 못쓴다?
- 그러면, 서로 통신하기 위한 인터페이스 스펙을 만들자. => WSGI
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
WSGI Application Interface
19
WSGI Application Interface 는 Callable Object 여야 함.
Callable Object(호출가능한 객체)
- 함수, 멤버 메소드, 인스턴스.__call__()
조건 :
1. 두개의 파라미터를 가져야 한다.
- 첫번째, CGI 변수와 유사한 값을 가지고 있는 dict 객체
- 두번째, CallBack 함수
2. list[Response Body(String)] 형을 반드시 리턴.
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
- 실제 반환하는 응답 데이터
- [문자열] 형태로 반환
 가장 기본적인 형태
WSGI Application Interface
21
 __call__ 을 이용하는 경우
 멤버 메소드를 이용하는 경우
WSGI Application Interface
22
GET QueryString Parsing
POST Form data Parsing
WSGI Middleware
23
WSGI Application – HTTP 요청을 처리
WSGI Middleware
- WSGI Application 전후의 처리 혹은 environ 의 확장
- PEP333 에 특별한 명세는 없음. 가이드만.
WSGI Middleware
24
http://localhost:8000?name=ash84&age=31
데코레이터 같은 느낌.
WSGI
25
http://flask.pocoo.org/docs/deploying/wsgi-standalone/
flask-tornado
26
flask/app.py/class Flask
WSGI Application Interface
flask-tornado
27
tornado/wsgi.py/class WSGIContainer
request – tornado 서버를 통해서 들어온 HTTP 요청에 해당하는 tornado.HTTPRequest 객체
WSGIContainer.envrion – 내부의 값을 WSGI environ 에 필요한 형식으로 맞추는 작업
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
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 구현체
wsgiref
30
 demo_app 사용의 예
wsgiref
31
 wgsiref.validator(app)
- WSGI 응용프로그램을 감싸는 새로운 WSGI 응용 프로그램 생성
- 새로운 응용프로그램에서 감싼 대상이 WSGI 표준에 맞는지 검사하고 실행.
- 위반 사항이 있으면 AssertionError 예외 발생
정리
32
정적 웹 서버 => SimpleHTTPRequestServerHandler
모든 HTTP methods 구현 => BaseHTTPReqeustHandler 의 서브클래스 이용
do_method(requset) { 구현 }
WSGI 는 서버-웹 어플간의 인터페이스 스펙
웹 프레임워크가 WSGI 기반인지 확인
웹 서버-WSGI 지원 모듈 확인 Apache => mod-wsgi
ngix => uwsgi

Contenu connexe

Tendances

닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
흥배 최
 

Tendances (19)

Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Jstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNG
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10
 
Html5 performance
Html5 performanceHtml5 performance
Html5 performance
 
Ryu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIRyu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST API
 
Node.js intro
Node.js introNode.js intro
Node.js intro
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구
 
Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터
 
Apache solr소개 20120629
Apache solr소개 20120629Apache solr소개 20120629
Apache solr소개 20120629
 
Startup JavaScript 7 - Node.JS 기초
Startup JavaScript 7 - Node.JS 기초Startup JavaScript 7 - Node.JS 기초
Startup JavaScript 7 - Node.JS 기초
 
4-2. ajax
4-2. ajax4-2. ajax
4-2. ajax
 
Federated Engine 실무적용사례
Federated Engine 실무적용사례Federated Engine 실무적용사례
Federated Engine 실무적용사례
 
Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문
 
Spring boot actuator
Spring boot   actuatorSpring boot   actuator
Spring boot actuator
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.js
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivity
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기
 
제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈
제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈
제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈
 

Similaire à 파이썬 웹 프로그래밍 2탄

Similaire à 파이썬 웹 프로그래밍 2탄 (20)

11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례
11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례
11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례
 
Node.js 첫걸음
Node.js 첫걸음Node.js 첫걸음
Node.js 첫걸음
 
AWS Meetup 프리젠테이션.pdf
AWS Meetup 프리젠테이션.pdfAWS Meetup 프리젠테이션.pdf
AWS Meetup 프리젠테이션.pdf
 
Servlet3
Servlet3Servlet3
Servlet3
 
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine Learning
 
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
 
ASP.NET Web API를 활용한 RESTful 서비스 개발
ASP.NET Web API를 활용한 RESTful 서비스 개발ASP.NET Web API를 활용한 RESTful 서비스 개발
ASP.NET Web API를 활용한 RESTful 서비스 개발
 
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
 
[오픈소스컨설팅] OpenShift PaaS Platform How-to
[오픈소스컨설팅] OpenShift PaaS Platform How-to[오픈소스컨설팅] OpenShift PaaS Platform How-to
[오픈소스컨설팅] OpenShift PaaS Platform How-to
 
2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp2Naver Open Android API Translation At DCamp
2Naver Open Android API Translation At DCamp
 
REST Ovewview
REST OvewviewREST Ovewview
REST Ovewview
 
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
 
Internship backend
Internship backendInternship backend
Internship backend
 
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
 
서버성능개선 류우림
서버성능개선 류우림서버성능개선 류우림
서버성능개선 류우림
 
HTTP 완벽가이드 - ch5. web server
HTTP 완벽가이드 - ch5. web serverHTTP 완벽가이드 - ch5. web server
HTTP 완벽가이드 - ch5. web server
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.
 
PHP Slim Framework with Angular
PHP Slim Framework with AngularPHP Slim Framework with Angular
PHP Slim Framework with Angular
 

Plus de SeongHyun Ahn

카피캣으로 시작하는 오픈소스
카피캣으로 시작하는 오픈소스 카피캣으로 시작하는 오픈소스
카피캣으로 시작하는 오픈소스
SeongHyun Ahn
 
Introduction of scrum 안성현 20120606
Introduction of scrum 안성현 20120606Introduction of scrum 안성현 20120606
Introduction of scrum 안성현 20120606
SeongHyun Ahn
 
디자인 패턴 데코레이터 패턴
디자인 패턴 데코레이터 패턴디자인 패턴 데코레이터 패턴
디자인 패턴 데코레이터 패턴
SeongHyun Ahn
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장
SeongHyun Ahn
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
SeongHyun Ahn
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
SeongHyun Ahn
 

Plus de SeongHyun Ahn (15)

MQTT 를 이용한 주문시스템 개선
MQTT 를 이용한 주문시스템 개선 MQTT 를 이용한 주문시스템 개선
MQTT 를 이용한 주문시스템 개선
 
github : 유용한 기능들
github : 유용한 기능들 github : 유용한 기능들
github : 유용한 기능들
 
카피캣으로 시작하는 오픈소스
카피캣으로 시작하는 오픈소스 카피캣으로 시작하는 오픈소스
카피캣으로 시작하는 오픈소스
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법
 
파이썬 모듈 패키지
파이썬 모듈 패키지파이썬 모듈 패키지
파이썬 모듈 패키지
 
파이썬 파일처리 및 문자열 처리
파이썬 파일처리 및 문자열 처리 파이썬 파일처리 및 문자열 처리
파이썬 파일처리 및 문자열 처리
 
파이썬 유용한 라이브러리
파이썬 유용한 라이브러리파이썬 유용한 라이브러리
파이썬 유용한 라이브러리
 
파이썬 소개
파이썬 소개 파이썬 소개
파이썬 소개
 
실용주의 머신러닝 CNN MNIST TENSORBOARD
실용주의 머신러닝 CNN MNIST TENSORBOARD실용주의 머신러닝 CNN MNIST TENSORBOARD
실용주의 머신러닝 CNN MNIST TENSORBOARD
 
Pycon APAC 2016 후기
Pycon APAC 2016 후기Pycon APAC 2016 후기
Pycon APAC 2016 후기
 
Introduction of scrum 안성현 20120606
Introduction of scrum 안성현 20120606Introduction of scrum 안성현 20120606
Introduction of scrum 안성현 20120606
 
디자인 패턴 데코레이터 패턴
디자인 패턴 데코레이터 패턴디자인 패턴 데코레이터 패턴
디자인 패턴 데코레이터 패턴
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
 

파이썬 웹 프로그래밍 2탄

  • 1. 안성현(@SH84AHN) 웹 관련 프로그래밍 2탄 서버 만들기, WSGI 1
  • 2. 오늘 다룰 것들. 2 http package BaseHTTPServer/BaseHTTPServerHandler SimpleHTTPServerHandler HTTPServer CGIHTTPServerHandler WSGI/Application Interface/Middleware wsgiref
  • 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)
  • 5. BaseHTTPServer 5 기본적인 형태 - ip, port 지정해서 서버 띄우기, 서버요청 처리를 위한 핸들러 클래스 지정 - serve_forever() : shutdown() 호출될 때까지 요청을 처리한다.
  • 6. BaseHTTPServerHandler 6  핸들러의 함수 맵핑 - do_METHOD() - GET => do_GET() - POST => do_POST()
  • 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() - 헤더의 끝을 알리는 빈줄을 보낸다.
  • 11. BaseHTTPServerHandler 11 GET 으로 들어오는 요청을 처리해 보자. - “/” => “/main” 으로 리다이렉트
  • 12. BaseHTTPServerHandler 12 GET 으로 들어오는 요청을 처리해 보자 - “/person” => 404 - “/person?name=ash84&age=31” => json response
  • 13. SimpleHTTPServer. SimpleHttpRequestHandler 13 SimpleHTTPServer 모듈은 SimpleHttpRequestHandler 가 전부. - 현재 디렉토리와 그 하위의 디렉토리 파일 제공 - HEAD 와 GET 메서드만 제공 - 모든 IOError 예외는 404 File not found 에러 발생 - 일종의 정적 웹 서버를 만들어 준다. - 커스텀 하기 위해서는 서브 클래싱해서 사용. SimpleHTTPServer.SimpleHTTPRequestHandler(request, client_address, server)
  • 14. SimpleHTTPServer 14 simplehttpserver - sphttp.py - html - food -index.html - place -index.html  디렉토리내 index.html 이 있으면 디렉토리 접근시 index.html 불러와서 보여준다.
  • 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 - 실제 반환하는 응답 데이터 - [문자열] 형태로 반환  가장 기본적인 형태
  • 21. WSGI Application Interface 21  __call__ 을 이용하는 경우  멤버 메소드를 이용하는 경우
  • 22. WSGI Application Interface 22 GET QueryString Parsing POST Form data Parsing
  • 23. WSGI Middleware 23 WSGI Application – HTTP 요청을 처리 WSGI Middleware - WSGI Application 전후의 처리 혹은 environ 의 확장 - PEP333 에 특별한 명세는 없음. 가이드만.
  • 27. flask-tornado 27 tornado/wsgi.py/class WSGIContainer request – tornado 서버를 통해서 들어온 HTTP 요청에 해당하는 tornado.HTTPRequest 객체 WSGIContainer.envrion – 내부의 값을 WSGI environ 에 필요한 형식으로 맞추는 작업
  • 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 구현체
  • 31. wsgiref 31  wgsiref.validator(app) - WSGI 응용프로그램을 감싸는 새로운 WSGI 응용 프로그램 생성 - 새로운 응용프로그램에서 감싼 대상이 WSGI 표준에 맞는지 검사하고 실행. - 위반 사항이 있으면 AssertionError 예외 발생
  • 32. 정리 32 정적 웹 서버 => SimpleHTTPRequestServerHandler 모든 HTTP methods 구현 => BaseHTTPReqeustHandler 의 서브클래스 이용 do_method(requset) { 구현 } WSGI 는 서버-웹 어플간의 인터페이스 스펙 웹 프레임워크가 WSGI 기반인지 확인 웹 서버-WSGI 지원 모듈 확인 Apache => mod-wsgi ngix => uwsgi