CGI/WSGI 라이브러리
CGI/WSGI는 웹서버로 들어오는 요청을 웹어플리케이션으로 처리를 위임하여 결과를 반환받을 때 웹서버와 웹 어플리케이션 사이의 규약을 준수한 라이브러리
CGI의 단점을 업그레이드 시킨것이 WSGI 임
Django 는 WSGI를 사용함
CGI 관련 모듈 (현재에 와서 사용빈도 낮음)
- cgi 모듈 : FieldStorage 클래스 정의 ( post 요청으로 들어온 파라미터를 처리하기 위한 클래스 )
- cgitb 모듈 : 에러 발생 시, 에러에 대한 상세 정보를 제공하기 위한 모듈
WSGI
- WSGI 서버 (mod_wsgi, uWSGI, Gunicorn) : 범용 웹서버인 apache나 NginX는 wsgi 처리 기능이 없으므로, 그러한 웹서버와의 통신 규격을 처리해 주는 파이썬 모듈
- Django도 wsgi 규격을 처리해 줌으로 WSGI 서버라 할 수 있다
WSGI의 애플리케이션 처리 과정
- 웹서버가 요청을 받음 : url 분석 / 필요시 WSGI에 처리 위임
- WSGI 서버가 파라미터 전달받음 : wsgi.py 실행 / application(environ, start_response) 함수 호출 / console 출력
- environ : 프레임워크에 정의되어 있음, HTTP_HOST, HTTP_USER_AGENT, SERVER_PROTOCOL 등의 HTTP 환경변수
- start_response(status, headers) : 반드시 호출해야 하며, 인자가 이미 정해져 있음. 그냥 사용하면 됨
- application 이 실행됨 : environ 환경변수 처리 / 뷰 처리 / HTTPRequest 객체 생성 / start_response() 함수 호출 / HTTPResponse 리턴
- application 함수의 리턴값은 iterable 타입이어야 함
wsgiref.simple_server 모듈
웹 프레임워크가 제공하는 wsgi 서버
WSGIServer 클래스, WSGIRequestHandler 클래스 제공
장고의 runserver 도 wsgiref.simple_server 로 만듦
from wsgiref.simple_server import make_server
def application(environ, start_response):
status = '200 OK'
headers = [('Content-Type','text/plain')]
start_response(status, headers)
response = [b'This is a simple WSGI Application']
return response
if __name__ == '__main__':
print('Started WSGI Server on port 8888')
# wsgi API 규격 : make_server(), serve_forever()
server = make_server('',8888,application)
server.serve_forever()
- 웹브라우저에 ‘http://localhost:8888' 실행하여 확인