CGI/WSGI 라이브러리 📂

jurin·2021년 5월 24일
2

CGI 방식은 요청이 들어올 때마다 처리를 위한 프로세스가 생성되는 방식이라 짧은 시간에 많은 요청을 받으면 서버의 부하가 높아져서 프로세스가 멈추거나 다운될 수 있다.

이러한 CGI 방식의 단점을 해결하고 파이썬 언어로 웹 서버와 웹 애플리케이션 간의 연동 규격을 정의한 것이 WSGI(Web Server Gateway Interface) 규격 이다.

WSGI 규격만 맞추면 장고로 웹 애플리케이션을 작성하면 이 애플리케이션은 Apache 웹 서버에서도 실행할 수 있고, Nginx 웹 서버에서도 실행할 수 있다.

Apahce나 Nginx는 일반 범용 웹 서버로 WSGI 처리 기능이 없어서 이 중간에서 WSGI 통신 규격을 처리해주는 것이 mod_wsgi, uWSGI, Gunicorn과 같은 WSGI 서버이다.

WSGI 서버의 애플리케이션 처리 과정

파이썬 웹 프레임워크는 WSGI 서버를 제공하며 개발자는 WSGI 서버에 대한 API 규격만 맞추면 웹 서버와는 독립적으로 애플리케이션을 작성할 수 있어 생산성이 높아진다.

출처: https://has3ong.tistory.com/176

WSGI 규격에 맞춰 개발 시 중요 사항

1. 개발이 필요한 애플리케이션 함수 또는 클래스의 메소드로 정의하고 애플리케이션 함수의 인자는 다음과 같이 정의한다.

def application_name(environ, start_response) :
  • environ : 웹 프레임워크에 이미 정의되어 있으며 HTTP 환경변수를 포함한다.
  • start_response : 애플리케이션 내에서 응답을 시작하기 위해 반드시 호출해야 하는 함수

2. start_response 함수의 인자는 다음과 같이 정의한다.

start_response(status, headers)
  • status : 응답 코드 및 응답 메세지를 지정(200 OK, 404 Not Found 등)
  • headers : 응답 헤더를 지정한다.

3. 애플리케이션 함수의 리턴값은 응답 바디에 해당하는 내용으로 리스트나 제너레이터와 같은 iterable 타입이어야 한다.

wsgiref.simple_server 모듈

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()

위의 WSGI 서버 만들 때 중요 사항

  • wsgiref.simple_server 모듈은 WSGI 규격을 준수하여 WSGI 서버를 작성할 수 있도록 make_server() 및 serve_forever() 메소드 API를 제공한다.

  • my_app()과 같은 애플리케이션 로직을 호출 가능한 함수나 메소드로 정의하여 make_server 인자로 넘겨주어 WSGI 웹 서버를 만든다. 이는 애플리케이션 프로그램과 웹 서버 프로그램을 독립적으로 작성할 수 있게 해주는 WSGI의 중요한 원칙이다.

  • my_app() 함수에서 응답을 위한 헤더 및 바디를 구성해서 반환해준다.

앞의 http.server 모듈로 서버를 만드는 방식과 동일하다. 다른 점은 애플리케이션 로직을 작성하는 my_app() 함수가 추가되었다는 점이다.

[실행결과]





출처: Django로 배우는 파이썬 웹 프로그래밍(기초) - 김석훈님

profile
anaooauc1236@naver.com

0개의 댓글