파이썬 웹 관련 라이브러리는 2.x 버전과 3.x 버전이 다르게 구성되어 있다.
3.x 버전은 관련된 모듈을 모아 패키시를 만들었고, 모듈명을 통해 서버와 클라이언트 라이브러리를 구분했다.
이번에는 웹 클라이언트와 웹서버의 주요 라이브러리, 그리고 서버와 클라이언트의 연동을 위한 WSGI에 대해 알아보겠다.
파이썬의 웹 라이브러리 구성은 다음 사진과 같다.
웹 서버와 웹 클라이언트에 따라 패키지를 다르게 사용한다는 것을 위의 사진에서 알 수 있다.
웹클라이언트를 개발할 때 urllib 패키지를 많이 사용한다. 그 이유는 주로 URL 처리와 서버 엑세스 관련 API를 제공하고 있기 때문이다.
웹 서버를 프로그래밍 할 경우 http.cookie 또는 http.server 모듈은 거의 사용하지 않는다. 왜냐면 장고같은 웹 프레임 워크를 사용해 웹 서버 프로그래밍을 하기 때문이다.
1. 웹 클라이언트 라이브러리
우리가 가장 많이 사용하는 웹 브라우저는 다양한 웹 클라이언트중 하나이다. 브라우저 외에도 웹 서버에 요청을 보내는 애플리케이션은 모두 웹 클라이언트라 할 수 있다.
파이썬은 클라이언트를 프로그래밍 할 수 있도록 여러 가지 라이브러리를 제공하고 있다.
1. urllib.parse 모듈 (parse는 해석한다는 의미를 가지고 있다.)
- URL의 분해, 조립, 변경 및 URL 문자 인코딩, 디코딩 등을 처리하는 함수를 제공한다.
- urllib.parse 모듈에서 urlparse() 함수는 가장 기본적인 함수로 URL을 파싱한 결과로 ParseResult 인스턴스를 반환한다.
2. urllib.request 모듈
- URL에서 데이터를 가져오는 기본 기능 제공.
- 이 모듈에서 사용하는 함수 중 urlopen() 함수만 잘 다뤄도 웬만한 웹 클라이언트는 작성 할 수 있다고 한다.
- urlopen()함수를 사용하는 방법은 GET/POST 방식, PUT/HEAD , 인증/쿠키/프록시 등 복잡한 처리 기능에 따라 다르다.
2.1 urllib.request 모듈보다 좀더 세밀한 기능이 필요한 경우 http.client 모듈을 사용한다.
- http.client 모듈을 사용하는 경우 코디의 순서는 다음과 같다.
1. 연결 객체 생성
EX) conn=http.client.HTTPConnection("www.python.org")
2. 요청 보냄
EX) conn.request("GET","/index.html")
3. 응답 객체 생성
EX) response=conn.getresopnse()
4. 응답 데이터 읽음
EX) data = response.read()
5. 연결을 닫음
EX) conn.close()
2. 웹 서버 라이브러리
- 보통 웹 프레임 워크를 사용해 웹서버를 개발하는 경우가 대부분이지만 웹 서버 라이브러리를 알면 중급, 고급 기술자가 되기위한 발판이 될 수 있다.
- 웹 서버는 일정한 규칙에 의해 작성 되며 HTTPserver 클래스나 적절한 핸들러 클래스를 상속받아 기능을 확장해 나간다.
- 파이썬에서는 웹서버를 만드는데 필요한 라이브러리를 http.server 모듈에서 정의하고 있으며 그중 주요 클래스는 다음과 같다.
1. HTTPserver
- 웹 서버를 만들기 위한 클래스로, 서버 IP와 PORT를 바인딩 한다
2. BaseHtTPRequestHandler
- 핸들러를 만들기 위한 기반 클래스로, HTTP 프로토콜 처리 로직이 들어있다
- 이 클래스를 상속받아 핸들러 클래스를 만든다
3. SimpleHTTPRequestHandler
- BaseHtTPRequestHandler 클래스를 상속받아 만든 클래스로, GET과 HEAD 메소드 처리가 가능한 핸들러 클래스이다
4. CGIhTTPRequestHandler
- SimpleHTTPRequestHandler클래스를 상속받아 만든 클래스로 POST,CGI 처리가 가능하다.
* 핸들러란?
다른 객체들이 보낸 데이터를 처리하는 객체/로깅한 정보가 출력되는 위치를 설정하는 녀석
- 위에 설명한 4개 클래스의 특징은 다음과 같다.
HTTPserver 와 BaseHtTPRequestHandler
- 이 두개 클래스는 웹서버를 만들기 위한 기반이 되는 클래스이다.
SimpleHTTPRequestHandler
- 필요할 때 즉시 웹서버를 실행하기 위한 클래스로 GET, HEAD방식을 처라한다
- 그러나 POST 등 HTTP 메소드는 처리가 불가능하다.
CGIhTTPRequestHandler
- SimpleHTTPRequestHandler와 유사하게 웹서비스를 즉시 실행시키는 것이 가능하고, GET , HEAD방식처리가 가능하다.
- 단, 모든 POST 방식을 처리할 수 있는건 아니다.
여기까지 웹 클라이언트와 웹서버의 주요 라이브러리와 클래스를 알아보았다.
파이썬에는 웹 클라이언트와 웹서버를 연동하는 규격이 존재하는데, 이를 WSGI(Web Server Gateway Interface)라 한다.
또한 예전에 사용하던 CGI 규격을 위한 cgi 모듈과 개선된 WSGI 규격을 구현하기 위한 wsgiref 모듈이 존재한다.
1. CGI 규격이란 ?
- 웹에서의 요청은 동적요청과 정적 요청으로 구분된다.
- 정적 요청은 웹 서버에 있는 파일을 그대로 요구하는 반면에, 동적 요청은 요청 시점에 따라 내용이 달라지는 특징을 가지고 있다.
- 동적 요청의 경우 사용자의 요청을 전달하고 처리 결과를 되돌려 주기위한 규격이 필요한데, 이를 CGI(Common Gateway Interface)라 한다.
2. WSGI 규격이란?
- CGI 방식으로 처리시 요청이 많을경우 서버의 부하가 높아져 다운이 될 수도 있다.
- 이런 단점을 해결하고 쉽게 애플리케이션을 작성할 수 있도록 정의한것이 WSGI 규격이다.
- WSGI 규격을 처리하는 것은 mod_wsgi, uWSGI, Gunicorn 같은 WSGI서버이다.
- 현재 WSGI 규격은 2010년에 PEP 3333규격으로 제정되어 있다.
WSGI 규격에 따라 애플리케이션 개발을 할 때 중요한 사항은 3가지가 존재한다.
1. 개발이 필요한 애플리케이션을 함수 또는 클래스의 메소드로 정의하며, 애플리케이션 함수인자는 다음과 같이 정의한다
def application_name(environ, start_response) :
2. start_response 함수의 인자 역시 다음과 같이 정의한다
start_response(status, headers)
3. 애플리케이션 함수의 리턴값은 응답 바디에 해당하는 내용으로, 리스트나 제너레이터와 같은 iterable 타입이여야 한다.
파이썬 표준 라이브러리에서는 웹 프레임 워크 개발자가 웹 서버와 연동 기능을 개발할 수 있도록 wsgiref 패키지의 하위 모듈로 wsgiref.simple_server 모듈을 제공하고 있다.
어디까지나 제공을 하고 있는것이지 필수로 사용해야 하는 기능은 아니다.
'Develop > python' 카테고리의 다른 글
Requests 모듈 사용법 (0) | 2020.01.13 |
---|---|
[Python]모듈이란? (0) | 2020.01.07 |
[파이썬 웹 프로그래밍] 웹 프로그래밍의 이해 (0) | 2019.11.24 |
변수와 리스트 (0) | 2019.09.07 |
파이썬은 무엇인가 (0) | 2019.09.07 |