質問: form.getvalue("text") print(text) ``` **cgiserver.py** ``` \# -*- coding: utf-8 -*- import http.server http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler) ``` ### 発生している問題・エラーメッセージ 上記のディレクトリ構成、ソースコードでWebサーバーを立ち上げ、該当するアドレスへアクセスすると、 htmlのフォームは正しく表示されるものの、送信後下記のようなエラーがブラウザ上で表示されます。 ``` Error response Error code: 501 Message: Can only POST to CGI scripts. Error code explanation: HTTPStatus.NOT_IMPLEMENTED - Server does not support this operation. ``` ### 試したこと 過去に同様の目的で同様のエラーが出ている方が質問されていたのですが、 「初歩的なディレクトリミスでした」と自己解決されていましたので、フォームのactionの先を確認したり、 result.pyをindex.htmlやcgiserver.pyと同じディレクトリに置いて実行したりをしてみましたが、特段結果は変わりませんでした・・・。 ### 補足情報(FW/ツールのバージョンなど) Pythonは3.5.2を利用しています。 初めての質問で何かと勝手がわかっていない部分もありますが、 何卒よろしくお願いします!
回答: いくつか誤りがあります。 * この場合CGIスクリプトを配置するディレクトリは、`cgi-bin/`でなければならない。(`cgi_bin/`になっている) * pythonスクリプトの冒頭、`#!/usr/bin/python3`などのShebang(シバン、シェバン)が無い。(Windowsで、拡張子の関連付けをしている場合は動くかもしれない) * 「cgiserver.py」の1行目、`\# -*- coding: utf-8 -*-`は`# -*- coding: utf-8 -*-` が正しい。行頭`\`が余計。(typo?) * 「result.py」の `if "text" not in form:` の`if`節が、インデント1文字余計。 いずれも、参考にされたサイトの記事では上記の問題はありません。質問者さんが参考にし、転記した際に誤ったものと思われます。 尚、`http.server`モジュールを利用してWEBサーバーを起動する場合、 ``` $ python -m http.server --cgi ``` で起動しているなら「cgiserver.py」は使っていないことになります。別にそれでも構いませんが、せっかくスクリプトを作ったのですから、 ``` $ python cgiserver.py ``` で起動すれば、同様なかたちでWEBサーバーが起動します。適時、使い分けると良いです。(これは、参考にされたサイトの記事には載っていませんでしたね)