[Python] Apache cgi에서 python을 사용하는 방법


Development note/Python  2020. 1. 21. 09:00

안녕하세요. 명월입니다.


이 글은 Apache cgi에서 python을 사용하는 방법에 대한 글입니다.


예전에 제가 python에서 웹 서버(http.server)에 대해 구축하는 방법을 설명했습니다.

링크 - [Python] 웹 서버를 기동하는 방법(http.server)


그러나 저도 실제로 http.server로 웹 서버를 구축해 본 경험은 없습니다. 사실 http.server로 서비스를 구축한다고 하면 http.server가 제대로 운영이 될까하는 의문도 많고, 좋은 웹 API가 많은데 굳이 python으로 웹 서버를 구축할 필요성을 느끼지 못해서 그렇습니다.

웹 API 플렛폼을 PHP로 설정하고 사용할 경우 보통 apache로 구축을 하게 됩니다. PHP 언어도 개인적으로 훌륭한 웹 스크립트 언어이고 자주 사용하는 언어입니다만 웹 환경상 멀티 스레드의 환경에서 운영되는 데, 이를 PHP언어로 제어하기가 한계가 있고, 여러가지 C의 DLL를 참조해서 사용하기는 하나 객체 포인터나 리소스 다루기가 쉽지가 않습니다.

그런 한계를 apache의 cgi에서 python을 운영함으로 어느정도 보완이 되지 않을까 싶습니다. 사실 저는 python의 통계나 그래프에 관한 라이브러리가 매우 많기 때문에 그걸 사용하기 위해 사용합니다. PHP의 언어의 한계를 넘어선 프로그래밍을 할 경우는 거의 없습니다.


그럼 apache에 php를 설정하는 방법은 예전에 설명한 적이 있으니 참고해 주세요.

링크 - [PHP] PHP 개발환경 만들기와 IDE(Eclipse) 설정하기


apache의 cgi로는 perl과 python을 사용할 수가 있는데, perl도 좋은 언어이긴 하지만 조금 옛날(?) 언어이기도 하고 커뮤니티도 작기 때문에.. 요즘 쓰기나 하나 싶기도 합니다.(perl 개발자 분들에게는 죄송합니다.)

먼저 apache의 httpd.conf 에서 cgi를 설정해야 합니다.

***
<Directory "${SRVROOT}/cgi-bin">
  AllowOverride none
  AddHandler cgi-script .cgi .pl .py
  Options +ExecCGI
  Require all granted
</Directory>
***

apache는 기본적으로 cgi가 perl로 설정이 되어 있기 때문에 python을 추가해야 합니다.

(참고로 apache가 실행되는 pc에는 python이 설치되어 있어야 합니다.)


그리고 apache 폴더에 가보면 cgi-bin폴더가 있는데, 거기에 index.py파일을 작성합니다.


#!D:\anaconda3\python.exe
# 최상단은 python이 설치되어 있는 경로이다.
# -*- coding: UTF-8 -*-
# 파일의 인코딩 타입이다.
import cgi;
# cgi는 cgi프로그램에 사용되는 모듈이다.
import cgitb;
# cgitb는 cgi프로그램 디버깅에 관한 모듈이다. (에러가 발생하면 php처럼 에러를 웹 화면에 표시해 준다.)
cgitb.enable();

# 파라미터를 취득하기 위한 함수
# get,post 구분없이 데이터를 가져온다.
form = cgi.FieldStorage();
# 파라미터 data를 취득한다.
data = form.getvalue('data');
# 파라미터 test를 취득한다.
test = form.getvalue('test');

html = f"""
<!DOCTYPE html>
<html>
  <head><title>python</title></head>
  <body>
    <form method='post'>
      <input type='text' name='test' value='hello'>
      <input type='submit'>
    </form>
    <br />
    data - {data} <br />
    test - {test} <br />
  </body>
</html>
""";

print("Content-type:text/html")
# http 프로토콜에서 header와 body의 구분은 개행이므로 반드시 넣어야 한다. 없으면 에러난다.(body가 없는 http파일이기 때문에)
print('')
print(html);

위 예제를 보면 제가 파라미터로 data와 test를 받고 출력하게 했습니다. 처음 get으로 들어가면 데이터가 없기 때문에 None으로 표시가 될 것입니다.

input 텍스트박스에 데이터를 누르고 submit를 누르면 위 처럼 결과가 나옵니다.


참조 - https://www.tutorialspoint.com/python/python_cgi_programming.htm


os.environ를 통해 헤더의 정보를 얻을 수 있는데, 헤더 정보에 따라 쿠키 값을 얻을 수도 있습니다.

#!D:\anaconda3\python.exe
# 최상단은 python이 설치되어 있는 경로이다.
# -*- coding: UTF-8 -*-
# 파일의 인코딩 타입이다.
import cgi;
# cgi는 cgi프로그램에 사용되는 모듈이다.
import cgitb;
# cgitb는 cgi프로그램 디버깅에 관한 모듈이다. (에러가 발생하면 php처럼 에러를 웹 화면에 표시해 준다.)
cgitb.enable();
# os.environ을 사용하기 위한 모듈이다.
import os;

print("Content-type:text/html")
print('')
print("<html><head><title>python</title></head><body>");
for param in os.environ.keys():
  print ("<b>%20s</b>: %s<br />" % (param, os.environ[param]));
print("</body></html>");

그리고 PHP와 session을 공유하고 싶으면, 예전에 jsp와 세션을 공유하는 방법에 대한 설명을 한 적이 있습니다.

링크 - [PHP] PHP와 JSP 간의 Session 공유(WDDX)

똑같이 WDDX타입으로 적용하면 사용할 수 있습니다.


여기까지 Apache cgi에서 python을 사용하는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.