LoginSignup
0
2

More than 3 years have passed since last update.

PythonCGIの基本

Last updated at Posted at 2020-05-31

想定環境

  • Ubuntu Server 18.04LTS
  • Python3

cgi-binディレクトリの作成

ホームディレクトリ直下にcgi-binディレクトリを作成する。

user@hostname:~$ mkdir cgi-bin
user@hostname:~$ cd cgi-bin

CGIスクリプトの作成

user@hostname:~/cgi-bin$ which python3
/usr/bin/python3

user@hostname:~/cgi-bin$ vi hello.py

whichコマンドでPython3のパスを確認しておく。

hello.py
#!/usr/bin/python3

print('Content-Type: text/html; charset=utf-8')
print()

print('<h1>Hello, World!</h1>')

コードの解説

  1. 1行目にShebang(シバン)と呼ばれるコメントを書く必要がある。
    Shebangはコンパイラの場所を示すもので、これがないとPythonのコードをPythonとして認識することができず予期せぬ挙動を招くことになる。
  2. 3行目のprint('Content-Type: text/html; charset=utf-8')がHTTPヘッダーとして機能し、コード内で出力した文字列をHTMLのBODYタグ内に埋め込むことができる。
    charsetの指定はファイルの文字コードを明示的に宣言したものである。
  3. 4行目のprintの空文は3行目のHTTPヘッダーを正常に機能させるために2つ分の改行が必要なため使用している。
    空文を使用したくない場合はHTTPヘッダーの記述をprint('Content-Type: text/html; charset=utf-8\n\n')とすることでも同様の挙動をする。

CGIの実行

CGIを実行するための手順を説明する。
1. cgi-binディレクトリと実行ファイルに実行権限を付与する。
2. pythonのテストサーバを起動する
3. ブラウザでアクセスして確認する

上記の3つの手順でローカル開発が可能となる。

公開したい場合はApache2を使用すれば公開することができる。(詳細はこちらの記事へ)

コマンド

user@hostname:~$ ls
cgi-bin

user@hostname:~$ sudo chmod -R +x cgi-bin

python3 -m http.server 8080 --cgi
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

注意点としてcgi-binディレクトリの直上でサーバを立ち上げる必要がある。
これでlocalhost上に公開された状態になったのでhttp://localhost:8080/cgi-bin/hello.pyにアクセスして表示されれば成功。

エラー

404 Not Found

  • ファイルが見つからないと言われているのでパスが間違っている可能性がある。
  • サーバを立ち上げ忘れていないか確認する。
  • URLやファイル名に間違いがないか確認する。

403 Forbidden

  • アクセス権限がないため弾かれている。
  • ターミナルに戻ってls -lコマンドで権限を確認してxがついているか確認する。
  • http://localhost:8080/cgi-binにアクセスしている場合はファイルまでの直リンクでアクセスする。

500 Internal Server Error

  • サーバ系のエラーで幅広いエラーで表示されるため原因の特定が難しい。
  • サーバを立ち上げたターミナルを表示するとServing HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...の下にアクセスログが表示されているのでエラー内容を確認して対処する。
    • エラーログを確認するときは下から上に向かって読んでいくと理解しやすく、効率的に解消できる。

画面が真っ白になる・ソースコードがそのまま表示される

  • 共通
    • HTTPヘッダーの記述を間違えている可能性が高い。
    • 改行の数は適正か、セミコロンを忘れたり打ち間違えたりしていないかなどを確認する。
    • もしくはShebangのパスや文法を間違えていないか確認する。
  • ソースコードがそのまま表示される
    • サーバの立ち上げで--cgiを忘れていないか確認する。
0
2
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
0
2