[파이썬] 파이썬3로 CGI 이용하기
2011. 7. 12. 04:36
파이썬에서 지원하는 CGI(Common Gatewaay Interface) 라이브러리를 가지고 놀아보기로 했다. 요즘에 참 웹을 많이 가지고 노는 듯. 요즘 같이 어울리는 녀석이 웹인재인지라...
일단은 CGI를 테스트하기 위해 웹서버가 필요하다. 그것도 모른채 파이썬 공식 사이트의 CGI 라이브러리 설명이랑 웹서핑을 통해 얻은 기본 소스들만 계속해서 보다가 시간만 왕창날렸다. 웹에서 돌아가는건데 당연히 웹에서 테스트해야지.ㅠㅠ 우분투를 쓰고 있고, 아주 오래전에 아파치 웹서버를 설치해 놓았었기 때문에 따로 뭐 더 설치할 것은 없고, 파이썬을 CGI처럼 쓰기 위한 설정작업이 조금 필요했다.
아파치1을 설치했으면 httpd.conf 파일을 설정해야되는 것 같던데, 나는 아파치2를 설치해서 다른 파일을 손봐야했다. /etc/apache2/sites-enabled 폴더에 가면 000-default 파일이 있다. 이 파일은 관리자 권한으로 접근해야 수정할 수 있다.
sudo vi /etc/apache2/sites-enabled/000-default
터미널을 실행한 뒤 위의 명령어를 입력하면 해당 파일을 vi 편집기로 편집할 수 있다. (나는 vi 대신 gedit 을 이용했다.
나는 따로 웹서버의 루트 폴더를 사용자 계정으로 바꾸지 않았기 대문에, 웹서버의 루트폴더는 기본 폴더인 /var/www 로 되어있었다. 000-default 파일을 보면 위와 같은 부분이 있다. 당연히 빨간색 두 줄은 내가 직접 추가한 파일이다. 저 빨간색 두 줄을 추가하도록하자.
Options +ExecCGI 는 웹서버에서 CGI를 실행가능하도록 하는 설정이고
AddHandler cgi-script 는 어떤 확장자의 파일을 실행할 것인지 설정한다. 뒤에 실행할 파일의 확장자를 추가해주면 된다. 여기서는 .cgi와 .py를 추가했으므로 cgi파일과 python파일을 실행할 수 있다.
이제 웹서버쪽의 설정은 끝. 파이썬 코드를 작성해보자.
index.html
cgi_test.py
위 두 파일을 웹서버 루트폴더에 넣고 http://localhost/ 에 접속하면 아래와 같이 index.html파일이 열린다.
텍스트박스에 임의의 내용을 입력하고 버튼을 클릭하면 cgi_test.py가 호출된다. 여기서 cgi라이브러리에 주목하자. cgi.FieldStorage() 가 실행되면서 index.html파일이 넘겨준 form의 내용을 form이라는 이름의 변수에 저장하고 있다. 그리고 넘겨받은 이름 중에 email 이란 것이 없으면 Error, 있으면 그 내용을 출력한다.
일단은 CGI를 테스트하기 위해 웹서버가 필요하다. 그것도 모른채 파이썬 공식 사이트의 CGI 라이브러리 설명이랑 웹서핑을 통해 얻은 기본 소스들만 계속해서 보다가 시간만 왕창날렸다. 웹에서 돌아가는건데 당연히 웹에서 테스트해야지.ㅠㅠ 우분투를 쓰고 있고, 아주 오래전에 아파치 웹서버를 설치해 놓았었기 때문에 따로 뭐 더 설치할 것은 없고, 파이썬을 CGI처럼 쓰기 위한 설정작업이 조금 필요했다.
아파치1을 설치했으면 httpd.conf 파일을 설정해야되는 것 같던데, 나는 아파치2를 설치해서 다른 파일을 손봐야했다. /etc/apache2/sites-enabled 폴더에 가면 000-default 파일이 있다. 이 파일은 관리자 권한으로 접근해야 수정할 수 있다.
sudo vi /etc/apache2/sites-enabled/000-default
터미널을 실행한 뒤 위의 명령어를 입력하면 해당 파일을 vi 편집기로 편집할 수 있다. (나는 vi 대신 gedit 을 이용했다.
...
<Directory /var/www>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
Options +ExecCGI
AddHandler cgi-script .cgi .py
</Directory>
...
</Directory>
나는 따로 웹서버의 루트 폴더를 사용자 계정으로 바꾸지 않았기 대문에, 웹서버의 루트폴더는 기본 폴더인 /var/www 로 되어있었다. 000-default 파일을 보면 위와 같은 부분이 있다. 당연히 빨간색 두 줄은 내가 직접 추가한 파일이다. 저 빨간색 두 줄을 추가하도록하자.
Options +ExecCGI 는 웹서버에서 CGI를 실행가능하도록 하는 설정이고
AddHandler cgi-script 는 어떤 확장자의 파일을 실행할 것인지 설정한다. 뒤에 실행할 파일의 확장자를 추가해주면 된다. 여기서는 .cgi와 .py를 추가했으므로 cgi파일과 python파일을 실행할 수 있다.
이제 웹서버쪽의 설정은 끝. 파이썬 코드를 작성해보자.
index.html
<!doctype>
<html>
<head>
</head>
<body>
<form name="form" method="get" action="http://localhost/cgi_test.py">
<p>
email : <input type="text" name="email">
name : <input type="text" name="name">
<input type="submit" value="CLICK">
</p>
</form>
</body>
</html>
cgi_test.py
#!/usr/bin/env python
#-*- coding: euc-kr -*-
import cgi
import cgitb #스크립트 오류 등의 에러발생시 브라우저에 에러 내용을 보여준다.
cgitb.enable()
print("Content-type: text/html\n") #\n 을 안하면 Internal Server Error 발생!
print('<html>')
print('<head>')
print('<title>Hello Word - First CGI Program</title>')
print('</head>')
print('<body>')
form = cgi.FieldStorage()
if "email" not in form:
print("Error!")
else:
print("Your email address is " + form["email"].value)
print("Your email address is " + form["email"].value)
print('</body>')
print('</html>')
위 두 파일을 웹서버 루트폴더에 넣고 http://localhost/ 에 접속하면 아래와 같이 index.html파일이 열린다.
텍스트박스에 임의의 내용을 입력하고 버튼을 클릭하면 cgi_test.py가 호출된다. 여기서 cgi라이브러리에 주목하자. cgi.FieldStorage() 가 실행되면서 index.html파일이 넘겨준 form의 내용을 form이라는 이름의 변수에 저장하고 있다. 그리고 넘겨받은 이름 중에 email 이란 것이 없으면 Error, 있으면 그 내용을 출력한다.
성공적으로 form의 이메일을 잘 받아서 출력해주는 것을 알 수 있다. 이 외의 여러 cgi 관련 라이브러리들은 http://docs.python.org/py3k/library/cgi.html 에서 확인할 수 있다.
중간에 수도 없이 Internal Server Error 메시지를 보기도 하였고, cgitb 라이브러리를 이용하여 브라우저에 뜨는 에러메시지를 보니 파이썬2.7.1이 인터프리터로 나오는 등 무수한 문제점과 의문에 부딪혔었다. 쓸데없이 웹서버 설정을 이리저리 바꾸기도 하고 서버를 재시작하는 등 삽질을 하다가 파이썬3에서는 안된다는 어느 외쿡인의 글을 보면서 좌절하기도 했었는데 막상 성공하고나니 뿌듯하면서도 한편으로는 허무함. 오늘도 이렇게 나의 삽질 내공은 쌓여간다.