파이썬 어플리케이션을 실행하고자하는 웹서버는 wsgi라는 규격을 준수해야한다.
WSGI?
웹 서버와 웹 어플리케이션을 연결해주는 규격으로 Django, Flask, Fast API, 같은 웹 프레임워크 개발과 개발한 웹 프레임워크를 Apache, Nginx 등 웹 서버와 연동할 때 사용한다.
파이썬의 WSGI 규격은 전통적인 CGI 기술의 단점을 개선하고 파이썬 언어에 맞게 재구성한 것으로 파이썬 표준 라이브러리에는 예전의 CGI 규격을 위한 cgi 모듈과 개선된 WSGI 규격을 구현하기 위한 wsgiref 모듈이 같이 존재한다.
CGI 관련 모듈 - CGI?
사용자의 요청은 웹 서버에 있는 파일을 요청하는 정적 요청과 동일한 요청이라도 요청 시점에 달라지는 요청과, 클라이언트와 상호작용에 따라 달라지는 동적 요청으로 구분된다.
동적 요청은 웹서버가 아닌 별도의 웹 어플리케이션 서버를 통해 처리하는데 웹 서버는 동적요청을 받아 어플리케이션에 넘겨주고 결과를 받는 기능이 필요하다.
웹 서버가 사용자의 요청을 어플리케이션에 전달하고 어플리케이션의 처리 결과를 어플리케이션으로 부터 되돌려받기 위한 규격을 CGI(Common Gateway Interface)라고 한다.

요청에 대한 CGI 처리 다이어그램
파이썬 표준 라이브러리에서는 이러한 CGI처리를 할 수 있도록 cgi, cgitb 모듈을 제공한다.
- cgi 모듈 : 요청에 포함된 파라미터를 처리하기 위한 FieldStorage 클래스를 정의
- cgitb 모듈 : CGI 어플리케이션 ( 파이썬 스크립트 )을 실행하는 과정에서 에러가 발생하면 에러에 대한 상세 정보를 표시해준다.
파이썬은 WSGI 기술로 대부분의 CGI에 대한 처리를 하고있어서 위 모듈을 사용할 일은 드물다.
WSGI 처리과정
CGI 방식은 요청이 들어올때 마다 처리를 위한 프로세스가 생성되기 때문에 짧은 시간동안 많은 요청을 받게 되면 서버의 부하가 높아지게 된다. 이러한 단점을 해결하고 웹 어플리케이션과 웹 서버의 연동 규격을 새로 정의한 것이 wsgi이다.
WSGI 규격만 맞는다면 Django로 웹 어플리케이션을 개발하고 Apache, Nginx 웹 서버에서 모두 실행 가능하다. 다만 아파치와 엔진엑스의 경우 범용 웹 서버이므로 WSGI 처리 기능이 없다. 따라서 두가지 웹 서버와 파이썬 웹 어플리케이션의 통신을 위해서는 중간에서 WSGI 통신 규격을 처리해주는 mod_wsgi, uWSGI, Gunicorn과 같이 WSGI 서버가 필요하다.
클라이언트의 요청에 대한 처리 과정은 아래와 같다.
- 웹 서버로 Request가 들어온다.
- Request의 URL을 분석
- WSGIScriptAlias에 정의된 URL이면, WSGI 서버에 처리 위임
- WSGI 서버로 파라미터 전달
- WSGIScriptAlias에 정의된 wsgi.py 실행
- application(environ, start_response) 함수 호출
- application call
- environ 환경 변수 처리
- View 처리, HTTPRequest 객체 생성
- start_response() 함수 호출
- return HTTPResponse
- WSGI서버로 return
- 표준 출력 (stdout)에 결과 출력
- 처리 결과를 웹서버로 return
- 웹 서버에서 결과 Response
wsgiref.simple_server 모듈
파이썬 표준 라이브러리에서는 웹 프레임워크 개발자가 웹 서버와 연동 기능을 개발할 수 있도록 wsgiref 패키지에 wsgiref.simple_server 모듈을 제공하고 있다.
WSGI 규격을 준수하는 웹서버 (WSGI 서버)에 대한 참조 서버로 개발자에게 참조가 될 수 있도록 미리 만들어 놓은 WSGIServer 클래스와 WSGIRequestHandler 클래스를 정의하고 있다.
Django에서 스크립트를 실행 할 때 사용하는 runserver 커맨드도 위 클래스를 사용하여 만든 테스트용 웹서버이다.
주의해야 할 것은 모든 웹 프레임워크가 wsgiref를 사용하지는 않는다는 점이다.
예시로 Flask에서는 Werkzeug(벡자이크라고 읽음) WSGI 서버를 사용하는데 wsgiref 패키지를 사용하지 않고 WSGI 서버를 실행한다.