dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

PythonでCGIを動かす(Python2, Python3)

import cgi とかしてるファイルをローカルでどうやって動かすのか色々調べたメモ。

最初、Apache で動かす必要があるのかと思い、

などを参考にファイルを /Library/WebServer/CGI-Executables に置いたり
/etc/apache2/httpd.conf の設定を変更したりしてたんですが
Python のモジュールで実現できました。

主に Python3 で動かすことを想定して調べてたんですが、Python2 でも起動はできたので両方書いておきます。

手順

ファイルの用意

cgi-bin ディレクトリを作り、その下に実行したい Python ファイル(ここでは test.py )を作成します。

.
└── cgi-bin
     └── test.py

test.py の例です。

#!/usr/bin/env python

print('Content-type: text/html; charset=UTF-8\r\n')
print('Hello, World!')

1行目以外は表示したいコンテンツに合わせて自由に変えて OK です。
1行目ですが、

#!/usr/bin/python

と書く方法もありますが、pyenv などでシステムデフォルトでない Python を使っている場合はこちらの方が良いです。

また、いずれも指定しなかった場合、あとでサーバーを起動してアクセスした時に

OSError: [Errno 8] Exec format error

というエラーが発生します。

ファイルを用意したらサーバーを起動します。


CGI サーバーの起動

1. Python2 の場合

SimpleHTTPServer と同じように CGIHTTPServer を使って以下のコマンドを実行します。

$ python -m CGIHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
2. Python3 の場合

多くのサイトでは、以下のように cgi-bin ディレクトリと同じ階層にファイル(ここでは cgiserver.py)を用意するように書かれています。

.
├── cgi-bin
│   └── test.py
└── cgiserver.py

cgiserver.py の中身は以下の通りです。

# -*- coding: utf-8 -*-
import http.server
http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)

そして、このファイルを実行します。

$ python cgiserver.py
Serving HTTP on 0.0.0.0 port 8000 ...

これでもいいのですが、公式ドキュメント を読むと
http.server--cgi というオプションを指定する ことで
Python2 と同様ワンライナーでいけるみたいです。

$ python -m http.server --cgi
Serving HTTP on 0.0.0.0 port 8000 ...


ブラウザでアクセス

作成したファイルが test.py の場合、

http://localhost:8000/cgi-bin/test.py

にアクセスします。

リファレンス