CGI 방식은 요청이 들어올 때마다 처리를 위한 프로세스가 생성되는 방식이라 짧은 시간에 많은 요청을 받으면 서버의 부하가 높아져서 프로세스가 멈추거나 다운될 수 있다.
이러한 CGI 방식의 단점을 해결하고 파이썬 언어로 웹 서버와 웹 애플리케이션 간의 연동 규격을 정의한 것이 WSGI(Web Server Gateway Interface) 규격 이다.
WSGI 규격만 맞추면 장고로 웹 애플리케이션을 작성하면 이 애플리케이션은 Apache 웹 서버에서도 실행할 수 있고, Nginx 웹 서버에서도 실행할 수 있다.
Apahce나 Nginx는 일반 범용 웹 서버로 WSGI 처리 기능이 없어서 이 중간에서 WSGI 통신 규격을 처리해주는 것이 mod_wsgi, uWSGI, Gunicorn과 같은 WSGI 서버이다.
파이썬 웹 프레임워크는 WSGI 서버를 제공하며 개발자는 WSGI 서버에 대한 API 규격만 맞추면 웹 서버와는 독립적으로 애플리케이션을 작성할 수 있어 생산성이 높아진다.
출처: https://has3ong.tistory.com/176
def application_name(environ, start_response) :
start_response(status, headers)
wsgiref.simple_server 모듈은 WSGI 스펙을 준수하는 웹 서버에 대한 참조 서버, 즉 개발자에게 참고가 될 수 있도록 미리 만들어 놓은 WSGIServer 클래스와 WSGIRequestHandler 클래스를 정의하고 있다.
장고의 runserver도 이들 클래스를 사용하여 만든 테스트용 웹 서버
from wsgiref.simple_server import make_server
def my_app(environ, start_response):
status = "200 OK"
headers = [('Content-Type', 'text/plain')]
start_response(status, headers)
response = [b"This is a sample WSGI Application."]
return response
if __name__ == '__main__':
print("Started WSGI Server on port 8888...")
server = make_server('', 8888, my_app)
server.serve_forever()
wsgiref.simple_server 모듈은 WSGI 규격을 준수하여 WSGI 서버를 작성할 수 있도록 make_server() 및 serve_forever() 메소드 API를 제공한다.
my_app()과 같은 애플리케이션 로직을 호출 가능한 함수나 메소드로 정의하여 make_server 인자로 넘겨주어 WSGI 웹 서버를 만든다. 이는 애플리케이션 프로그램과 웹 서버 프로그램을 독립적으로 작성할 수 있게 해주는 WSGI의 중요한 원칙이다.
my_app() 함수에서 응답을 위한 헤더 및 바디를 구성해서 반환해준다.
앞의 http.server 모듈로 서버를 만드는 방식과 동일하다. 다른 점은 애플리케이션 로직을 작성하는 my_app() 함수가 추가되었다는 점이다.
[실행결과]
출처: Django로 배우는 파이썬 웹 프로그래밍(기초) - 김석훈님