D2MatE Top  this page

CGIプログラムのdebug

関連プログラム


CGIファイルのowner, group, permissionの設定

 sambaを経由して実行可能ファイルのCGIファイルを設置した際に、CGIとして実行可能なownershipと permissionを設定する方法については、サービス (daemon) インストール の samba とACL設定を参照。 
sambaの設定だけで十分なはずだが、ACLの継承 (inherit) を利用すると、柔軟な設定が可能。


CGIアプリの開発手順

デバッグ情報の見方

import cgitb
cgitb.enable()  

を実行すれば、pythonのTracebackメッセージをブラウザに出力できる。
しかし、cgi、cgitbモジュールはpython3.13で廃止されたため、代替としてtracebackを 使うことができる。
import traceback
def handle_exception(exc_type, exc_value, exc_tb):
    """例外をHTML形式で出力"""
    print("Content-Type: text/html\n")
    print("<html><body>")
    print("<h2>Error:</h2>")
    print("<pre>")
    traceback.print_exception(exc_type, exc_value, exc_tb, file=sys.stdout)
    print("</pre>")
    print("</body></html>")
# エラーハンドラを設定
sys.excepthook = handle_exception

開発・デバッグ手順

  1. プログラム hogehoge.py を作成
  2. CLI として hogehoge.py を起動してデバッグ
    > python hogehoge.py
  3. サーバでCGIとして呼び出す際には、シェバンを使って起動できないといけない
    (そうでないとInternal Server Errorになる)
    > ./hogehoge.py
  4. hogehoge.py に query parameter を起動時引数として渡して動作検証
    > python hogehoge.py action=getFiles user=user password=pw
  5. 疑似POST動作で動作検証
     環境変数を設定して疑似POST関数を作って hogehoge.py を起動
     (API_test.py動作試験 プログラム (API_teest.pyを CLI として起動) を参照)
    > python query2cli.py
     
  6. > python http_server_me.py
    HTTPサーバを起動 
  7. hogehoge.pyをCGIとして呼び出すCLIプログラムで動作検証
     (API_test.py動作試験 プログラム (API_test.pyを CGI として利用) を参照)
    > python debug_API.py 2 http://server/cgi-bin/cgi.py action=get_info atom_name=Na
    など。2は、query parameterをGETで渡す場合。1は、http://server/action/の形のendopointを渡す場合、3はformでPOSTする場合に対応。
    Obsolete:
    > python query2cgi.py
     
  8. CGIはプログラム起動時のオーバヘッドが大きいため、パフォーマンスが必要な場合は
    FastCGI を使ってWSGIアプリ化する

Internal Server Errorが出る場合

以下の手順でエラーが無いかを確認する。
HTMLが表示されればOKだが、最初の行はContent-Type出なければいけない
  1. CLIとして実行してエラーを確認
    > python hogehoge.py
  2. shebangが機能しているかどうかを確認
    > ./hogehoge.py
  3. ここまでOKであれば、ユーザパーミッションなどの問題なので、HTTPサーバのユーザで実行する。
    多くの場合、apache2ではユーザapacheで実行する設定になっているが、
    この場合、apacheユーザはloginできないユーザなので、以下のsudoersの設定が必要。
    i) > sudo visudo
    ii) sudoersに追加 (/path/to/cmdは実行したいプログラムのフルパス)
         apache ALL=(ALL) NOPASSWD: /path/to/cmd
    iii) > sudo -u apache /path/to/cmd