質問: ### 前提・実現したいこと PythonにてCGIスクリプトを記述する練習をしており、 指南書片手にサンプルプログラムを書いているのですが、 指南書に書いてある動作を実現できず困っております。 ブラウザ上のテキストボックスへ任意の文字列を入力した後、 「送信」ボタンを押すと画面が切り替わり、 テキストボックスに入力された文字列を表示する、 という単純な内容です。 ※当方、プログラミング初心者につき、単語の理解等不十分なため、 違和感、誤りのある文章となってしまっているかもしれませんが、 何卒ご容赦ください。 ### 発生している問題・エラーメッセージ www ┣test.html ┗cgi-bin ..┗input.py 上記のフォルダの構造でwww上でcmdより 「python -m http.server --cgi 8000」と入力し、サーバを起動。 ブラウザのURL欄に「http://127.0.0.1:8000/test.html」と入力し、 htmlファイルを開き、テキストボックスに「あいうえお」と入力。 「送信」ボタンをクリックすると画面は切り替わるのですが、 文字列は表示されていない真っ白な画面で、タイトルもコード内で指定した 「受信したデータを表示」ではなく 「http://127.0.0.1:8000/cgi-bin/input.py」と表示されてしまいます。 また、画面遷移したあとにブラウザからinput.pyのソースを確認しようとすると、 cgi-bin>input.pyの階層は認識しているようなのですが、input.pyの中身が空のように見えています。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/7fce85b87d58fc15a5835b101c801e38.png) ### 該当のソースコード 【test.html】 CGIテスト テキストテスト テキスト入力: 【input.py】 import cgi import sys import io sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='shift_jis') html_body=""" 受信したデータを表示 %s """ form=cgi.FieldStorage() s=form.getvalue('mytext','') print(html_body % s) ### 試したこと 文字コードの関係かと思い、コード上のShift_JISを UTF-8に変えてみましたが、改善せず。 ### 実行環境 ・Windows10 ・Python 3.8
回答: 質問者さんと同じ環境ではないのですが、同じような問題は再現しましたので、その対策を回答として投稿します。 CGIのPython3スクリプトである「cgi-bin/input.py」は、ファイル自体の文字コードがシフトJISであるまま実行すると、 ``` C:\www>where python C:\Users\user01\AppData\Local\Microsoft\WindowsApps\python.exe C:\www>python --version Python 3.8.6 C:\www>python cgi-bin\input.py File "cgi-bin\input.py", line 12 SyntaxError: Non-UTF-8 code starting with '\x8e' in file cgi-bin\input.py on line 13, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details ``` 上記で示したように、エラーとなります。シフトJISの全角文字部分が影響し、スクリプト実行に悪影響をあたえているようです。そのシフトJISのスクリプトの冒頭で、ソースコードの文字コード指定をするとこのエラーを回避することができます。`# coding: shift_jis`を追加してみてください。 ``` # coding: shift_jis import cgi import sys ...続く ``` ひとつの解決策は、Pythonスクリプトのファイルも、CGIから出力するHTMLも、文字コードをUTF-8に統一することです。こちらの方が最近は一般的です。 ``` import cgi import sys import io # 使わない #sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='shift_jis') html_body=""" 受信したデータを表示 %s """ form=cgi.FieldStorage() s=form.getvalue('mytext','') print(html_body % s) ``` これでも解決しない場合は、もしかすると質問者さんお使いのPython実行環境が影響しているかもしれません。質問者さんが`where`コマンドで`python`を実行したときの結果は以下ですが、スクリプト実行時のPython3インタープリターについて、一体どれが動いてしまっているのか。 ``` C:\Users\sonos\Anaconda3\python.exe C:\Users\sonos\AppData\Local\Programs\Python\Python38\python.exe C:\Users\sonos\AppData\Local\Microsoft\WindowsApps\python.exe ```