1. やりたいこと、共有したいこと
簡単なWebアプリケーションを作ってみたいなと思い、Python3を使いCGIが使えるようにしたいと思いました。(この表現正しいかまだ分からないので、間違ってたらご指摘ください)
本当に、Python3もWebのバックエンドも初心者中の初心者なんですが、CGIを使うときに躓いたところがあったので、共有したいと思います。
環境はMacOSXで、Python3.6.0を使用しています。
2. 参考になるページ
挑戦する前に、プロの方がいろんなノウハウを共有してくださってますので、検索しました。Python3を勉強する上で、結構一貫して実践しながら進められるので、以下のサイトがおすすめです。
http://coreblog.org/ats/stuff/minpy_web/03/02.html
このURLは、CGIに関して書かれていますが、連載(?)シリーズ(?)になっているので、幅広くわかります。
3. 早速書いてみた、厳密には動かしてみた
3.1.ファイルとフォルダを用意する
ここを参考にコードを書きました。まずは、必要なフォルダとファイルを用意します。
server.py
index.html
python
|-test.py
3.2.コードを書く
ソースコードは、前述した
http://coreblog.org/ats/stuff/minpy_web/03/02.html
のコードをそのまま使いました。著作権に触れると嫌なので、ここでは書きません。このページ参照してください。
3.3.動かしてみる
残念ながら動きませんでした。こんな感じでソースコードがそのままwebに出てきます。
3.4. なぜ動かないのか
Python3で、CGIをきちんと理解して使われている方は、「こんな初歩的なミス」と思われると思いますが、僕にはわからなかったんですね。調べても、それと言ったものが出てこないので、仕方がなくマニュアルを見ました。
https://docs.python.org/3.6/library/http.server.html?highlight=cgihttprequest#http.server.CGIHTTPRequestHandler
すると、cgiが動くデフォルトディレクトリというのがあってそれは、"cgi-bin"または"htbin"だよ。と言っていますね。
つまり、今回"python"というディレクトリの下のファイルを実行した(リクエストした後、無事に実行されてレスポンスが返ってきた)のが間違えだったのです。
この"python"のディレクトリ名を"cgi-bin"にすると、きちんと動きました。
4.おまけ
けど、この「指定されたディレクトリ名の下でしか、cgiを動かせない」と言うのは気に入らないですよね。(僕だけかもしれませんが)
そこで、このディレクトリ名を指定できる方法がマニュアルに書いてあるので、紹介したいと思います。
import http.server
server_address = ("", 8000)
handler_class = http.server.CGIHTTPRequestHandler #1 ハンドラを設定
handler_class.cgi_directories = ["/python"]
server = http.server.HTTPServer(server_address, handler_class)
server.serve_forever()
ソースコードは、上のとおりです。何が違うかというと
handler_class.cgi_directories = ["/python"]
こいつですね。このように指定してあげると、pythonのディレクトリの下でも、cgiを使えるようになります。
5.最後に
「ここ間違ってるよ!」とか「ここやばいよ!」というのがあれば、ご教授いただけると幸いです。
この記事に直接メッセージいただけると助かります。よろしくお願いします。