4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Mac】PythonでCGIが動く簡単なHTTPサーバー作りたい

Posted at

やること

CGIが動く簡単なローカルのHTTPサーバーをPythonで構築します。

簡単なものだとPerlではなくて、PythonでもCGIスクリプト書けそうということでやってみました。

環境

  • MacOS Mojave
  • Python 3.7.5

CGIって何

CGIとはCommon Gateway Interfaceの略で、Webサーバー上でプログラムを使って処理した結果を表示させる機能のことです。

CGIってなあにより引用)

要は、動的なウェブページを作ったりするのにブラウザから値取ってきたりしてサーバー側で処理してまた返すみたいなことが出来る機能のことだと思います。

ローカルのHTTPサーバーの準備

まずはサーバーをたてないといけないのでローカルでHTTPサーバーをたてて、ウェブページを表示させます。

表示したいページを作成するために、作業したいディレクトリの中にIndex.htmlを書きます。
今回は送信するデータをfoodとseasonにします。

index.html
<html>
    <head>
        <title>サーバーテスト</title>
        <meta http-equiv="content-type" charset="utf-8">
    </head>
    <body>
    <form action="/cgi-bin/cgi_test.py" method="POST">
        <div>
            <label for="name">好きな食べ物</label>
            <input type="text" name="food" value="りんご">
            <label for="season">好きな季節</label>
            <input type="text" name="season" value="冬">
            <button>送信</button>
        </div>
    </form>
    </body>
</html>

ここで注意しないといけないのは、アクションのパスを

"/cgi-bin/CGIスクリプトファイル名"

とすることです。
これがCGIスクリプトファイルへの相対パスとなっており、あとでここで指定したスクリプトファイル名を使ってスクリプトファイルを作成します。

サーバーの起動テスト

一度サーバーを起動してみます。
ターミナルで起動させます。

$ python3 -m http.server 8080

実行すると下のようになると思います。
とりあえず8080番を使いましたが、使える番号であれば他の番号でも大丈夫です。

Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

では、動いているか確認してみてください。
http://localhost:8080/
うまくいっていれば以下のようになると思います。
ちなみにまだ送信ボタンを押してもエラーになるはずです。
server_test.png

CGIスクリプトの記述

では、CGIスクリプトをPyhonで記述します。
作業ディレクトリ(index.htmlがあるディレクトリ)にcgi-binという名のディレクトリを作成し、その中にCGIスクリプトを記述していきます。
ファイル構造はこのようになります。

.
├── cgi-bin
│   └── cgi_test.py
└── index.html

また、ここでのファイル名は先ほどindex.html内で指定した名前を使用してください。

cgi_test.py
#!/usr/bin/env python

import cgi
import cgitb
cgitb.enable()

print("Content-Type: text/html; charset=utf-8\n\n")

print("<html><body>")
form = cgi.FieldStorage()

for key in form:
    value = form[key].value
    print('<p>%s: %s</p>' % (key, value))

print("</body></html>")

ここでは1行目に必ず#!/usr/bin/env pythonと書くようにしてください。
これを書かないとOSError: [Errno 8] Exec format error:というエラーが発生します。
これはインタプリタの指定をしているのですが、詳しくは以下の記事などを参照してみてください。
#!/bin/sh は ただのコメントじゃないよ! Shebangだよ!(Qiita)

CGIスクリプトを実行してみよう

では、実行していきます。
先ほどと同様にターミナルでサーバーを起動させます。
ここではCGIを実行させるために--cgiオプションを追加してください。

python3 -m http.server 8080 --cgi

http://localhost:8080/ で起動を確認したら、今回は送信を押して確認してみてください。
cgi_test.png
表示できていれば成功です。

もしもエラーが出たら

送信ボタンを押しても表示されない場合、まずはどのようなエラーが出ているのかターミナルで確認してください。

・ パーミッションが755ではない(許可されていない)

code 403, message CGI script is not executable

→ cgi-binディレクトリ上のターミナルでchmod 755 CGIスクリプト名.pyとする。

・ 文字コードが設定されていない

SyntaxError: Non-ASCII character '\xe5'

→ ファイルの一番上に# coding:utf-8と追加する。

参考

python でお気楽Webサーバを構築してCGIのテスト。(Qiita)

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?