pythonでCGIに手を出して躓いた時

プログラム

pythonでCGIに手を出してつまづいた時。

さくらインターネットのレンタルサーバーでpython動かしたくて。

python3のインストールまでは

http://forex.hiho.jp/tips/pages/65.html

こちらのサイトを、

 

CGIを使えるようにするまでは

さくらでシンプルなPYTHON CGIを動かしてみる(環境設定編)

こちらのサイトを参考にさせて頂いて、

 

とりあえず動くところまでさくっと完了。でもさすがに開発はローカルでやりたいなーって思ってやり始める。そして完全に初歩的なところでハマった。。

 

 

CGIスクリプトを動かすまで

macとpythonはこれ。

  • macOS Sierra
  • Python 3.6.0 :: Anaconda 4.3.1 (x86_64)

 

使うライブラリはこれ。情報が溢れてるから。

  • http.server

 

作るファイルはこれ

# -*- Coding: utf-8 -*-

import http.server
http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)

と、これ

#!/usr/bin/python
# -*- Coding: utf-8 -*-

print("Content-type: text/html")
print("")
print(“cgitest”)

 

cgi.pyをcgi-binフォルダに格納。cgiserver.pyを実行、ちゃんと動いてると

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) …

ってなるから、その後

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

にアクセス。cgi-binとcgiserver.pyは同じ階層。

 

確認するところ

パーミッション

macの場合、cgi.pyのパーミッションを755に。

 

格納ディレクトリ

CGIHTTPRequestHandlerを使う時のCGIスクリプトを格納するディレクトリは、”cgi-bin” か ” htbin” じゃないとダメっぽい。

 

pythonの1行目

cgi.pyの1行目

#!/usr/bin/python

#!/usr/bin/env python

にすると動く場合があるらしい。

 

ヘッダの終わりを示す空行

print(“”)はヘッダの終わりを表すから必要。

空行は

print(“”)

でも良いし、

print(“\r\n\r\n”)

じゃないとダメとか

print(“\n\n”)

じゃないとダメとか

print(“\n”)

じゃないとダメとか、ちらほら見たけど自分の環境ではどれでも動いた。

 

改行コード

上記に関係してるのかもしれないけど、改行コードにも注意。

  • macOSとかのUnix系:LF
  • Windows:CRLF
  • Mac OS(9まで):CR

これにハマりかけた。

 

shebang

ちなみに自分が最もハマったのは、もっともっと初歩的なところで、

shebangを1行目に書いていなかったという。。

本当に1行目じゃないとダメらしい。上が詰まってる感じが嫌で1行目空行にして大抵2行目から書いてたからな。。ページを表示すると画面真っ白だという。。

 

てことで無事解決。

 

import cgi をするとき

無事解決かと思いきや、GET とか POST の値をとるために import cgi をするとブラウザ表示するときに

cgitestContent-type: text/html cgitest

と2回表示されるようになった。

 

問題はファイル名。cgiライブラリは cgi.py という名前だから被ってるから cgi.pyをリネームしてcgiserver.pyを実行し直せばOK。

 

ここも意外とハマった。。あんまり情報がなかったから、みんなこんなところでは躓かないんだろう。。

てことで、ようやく解決。だと思いたい。

 

コメント