파이썬 CGI 스크립트의 출력 원리
파이썬 CGI(Common Gateway Interface) 스크립트는 처리 결과를 웹 브라우저로 전송하기 위해 표준 출력(stdout)을 사용합니다. 즉, 일반적인 print() 함수를 통해 출력한 내용이 곧바로 브라우저에 표시되는 것입니다.
다만 아무 내용이나 출력하기 전에 반드시 지켜야 할 규칙이 있습니다. 바로 HTTP 헤더를 먼저 출력해야 한다는 점입니다.
1단계: Content-type 헤더 출력
CGI 프로그램은 브라우저에게 지금부터 보내는 데이터가 어떤 형식인지 알려주어야 합니다. 이를 위해 가장 먼저 다음 헤더를 출력합니다.
print("Content-type:text/html") # HTML 문서임을 알리는 HTTP 헤더
print() # 헤더와 본문을 구분하는 빈 줄(필수!)빈 줄이 꼭 필요한 이유
Content-type 헤더 다음에는 반드시 빈 줄 하나가 있어야 합니다. HTTP 프로토콜에서 헤더 부분과 실제 본문(body) 부분을 구분하는 역할을 하기 때문입니다. 이 빈 줄이 없으면 서버가 응답을 제대로 해석하지 못해 500 Internal Server Error가 발생할 수 있습니다.
2단계: HTML 본문 출력
헤더 출력이 끝나면 그 뒤로 브라우저에 표시할 HTML 코드를 print()로 작성하면 됩니다. HTML 폼에서 전달받은 이름 값을 화면에 출력하는 완전한 예제는 다음과 같습니다.
import cgi
form = cgi.FieldStorage()
# HTML 폼에서 입력값 가져오기
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
# 결과를 브라우저로 전송
print("Content-type:text/html")
print() # 헤더와 본문 구분용 빈 줄
print("<html>")
print("<head>")
print("<title>Hello - Second CGI Program</title>")
print("</head>")
print("<body>")
print("<h2>Hello %s %s</h2>" % (first_name, last_name))
print("</body>")
print("</html>")코드 설명
- cgi.FieldStorage(): GET 또는 POST 방식으로 전송된 폼 데이터를 파싱하여 저장하는 객체입니다.
- getvalue('필드명'): 해당 이름의 입력 필드 값을 가져옵니다. 값이 없으면 None을 반환합니다.
- %s 포맷팅: 가져온 first_name과 last_name 값을 HTML 문자열에 삽입하여 개인화된 인사말을 만듭니다.
정리
파이썬 CGI 스크립트가 결과를 브라우저로 보내는 방법은 간단히 세 단계로 요약할 수 있습니다.
Content-type:text/html헤더를 출력한다.- 헤더 뒤에 빈 줄 하나를 출력해 헤더와 본문을 구분한다.
- 브라우저에 표시할 HTML 본문을 print()로 출력한다.
참고로 최신 파이썬 버전(3.13 이상)에서는 cgi 모듈이 공식적으로 제거되었으므로, 새 프로젝트에서는 Flask, Django 같은 웹 프레임워크를 사용하는 것이 좋습니다. 하지만 CGI의 동작 원리를 이해하면 웹의 기본적인 요청-응답 구조를 파악하는 데 큰 도움이 됩니다.