質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2211閲覧

Pythonスクリプトをwebサーバ上で実行した際、白画面が表示されてしまう

PonpokopoNosuke

総合スコア0

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/23 14:38

編集2020/10/24 12:51

前提・実現したいこと

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の中身が空のように見えています。

イメージ説明

該当のソースコード

【test.html】

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="Shift_JIS"> <title>CGIテスト</title> </head> <body> <h1>テキストテスト</h1> <form action="/cgi-bin/input.py" method="POST"> <p><label>テキスト入力:<input type="text" name="mytext" size="20"></p> <p><input type="submit" value="送信"></p> </form> </body> </html>

【input.py】
import cgi
import sys
import io

sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='shift_jis')

html_body="""

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="Shift_JIS"> <title>受信したデータを表示</title> </head> <body> <h1>%s</h1> </body> </html> """ form=cgi.FieldStorage() s=form.getvalue('mytext','') print(html_body % s)

試したこと

文字コードの関係かと思い、コード上のShift_JISを
UTF-8に変えてみましたが、改善せず。

###実行環境
・Windows10
・Python 3.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/10/23 14:52

実行している環境の詳細を質問文中(つまり、このコメント欄ではなく)に追記してください。Windows 10であるとか、Linux(Ubuntu 14.04)であるとか。また、Pythonのバージョンもお願いします。
otn

2020/10/23 16:02

HTMLソースは見てないのでしょうか?
dodox86

2020/10/24 02:26

> sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='shift_jis') これは、どういう意図で書いたコードでしょうか。(文字コードはこの際関係ありません) 通常はCGIにとってのstdout(標準出力)を自ら置き換えることはしません。python -m http.server --cgiで起動するサーバーも同様です。何か特殊なサンプルを参照されましたか。
PonpokopoNosuke

2020/10/24 06:32

>dodox86さん 指南書には「Windowsではリクエストとして送信されてきた日本語をshift-JISとして扱うために必要。Macでは不要」と書いてあり、意味はわかっていないもののおまじない的に記述しておりました。
dodox86

2020/10/24 12:55

WindowsのPythonと言うことですよね。(WSL上のものではなく) コマンドプロンプト上で where python とコマンド実行するとどう出力されますか。 また、指南書で説明されている内容はLinuxなどではなくWindowsでの話でしたでしょうか。
PonpokopoNosuke

2020/10/24 13:01

はい、純粋にWindows上でのPythonです。 また、指南書もWindows用になっているかと思います。 (サンプルコードも「Windowsの場合はこちら」という風に場合分けされているため) where python の実行結果は下記のとおりです。 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
dodox86

2020/10/24 13:15

色々と聞いてすみません。 コマンドプロンプトを開き、www\cgi-bin のディレクトリ上で、input.py と入力して実行したらどうなりますでしょう。「python input.py」ではなく、「input.py」とだけ入力して実行する、という意味です。
PonpokopoNosuke

2020/10/24 14:02

とんでもありません、親身になって相談に乗っていただき本当にありがとうございます。「input.py」と入力して、実行するとVisual Studio Code上でinput.pyが開きます。pyファイルを開く規定のプログラムがVSCになっているためかと思われます。
guest

回答1

0

質問者さんと同じ環境ではないのですが、同じような問題は再現しましたので、その対策を回答として投稿します。

CGIのPython3スクリプトである「cgi-bin/input.py」は、ファイル自体の文字コードがシフトJISであるまま実行すると、

CMD

1C:\www>where python 2C:\Users\user01\AppData\Local\Microsoft\WindowsApps\python.exe 3 4C:\www>python --version 5Python 3.8.6 6 7C:\www>python cgi-bin\input.py 8 File "cgi-bin\input.py", line 12 9SyntaxError: 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 10

上記で示したように、エラーとなります。シフトJISの全角文字部分が影響し、スクリプト実行に悪影響をあたえているようです。そのシフトJISのスクリプトの冒頭で、ソースコードの文字コード指定をするとこのエラーを回避することができます。# coding: shift_jisを追加してみてください。

Python3

1# coding: shift_jis 2 3import cgi 4import sys 5...続く

ひとつの解決策は、Pythonスクリプトのファイルも、CGIから出力するHTMLも、文字コードをUTF-8に統一することです。こちらの方が最近は一般的です。

python3

1import cgi 2import sys 3import io 4 5# 使わない 6#sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='shift_jis') 7 8html_body=""" 9<!DOCTYPE html> 10<html lang="ja"> 11<head> 12<meta charset="utf-8"> 13<title>受信したデータを表示</title> 14</head> 15<body> 16<h1>%s</h1> 17</body> 18</html> 19""" 20form=cgi.FieldStorage() 21s=form.getvalue('mytext','') 22print(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

投稿2020/10/25 00:26

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PonpokopoNosuke

2020/10/26 06:57

回答ありがとうございます。ご提示いただいた内容を試してみましたが、改善しませんでした。 最後に記載いただいたインタープリターが複数ある?件について、インストールしなおす等の方法をとれば改善される可能性があるのでしょうか・・・?
dodox86

2020/10/26 17:52 編集

> インストールしなおす等の方法をとれば改善される可能性があるのでしょうか・・・? 改善される可能性はありますが、アンインストールならまだしも、インストールし直しでは状況は変わらないかもしれません。先立ってwhereコマンドで確認していただいた質問者さんのPythonですが、3つ入っていて、以下のようなものだと思います。 C:\Users\sonos\Anaconda3\python.exe ---(1) C:\Users\sonos\AppData\Local\Programs\Python\Python38\python.exe ---(2) C:\Users\sonos\AppData\Local\Microsoft\WindowsApps\python.exe ---(3) (1) AnacondaのPython (2) Windows用のインストーラーからインストールしたPython (3) MicrosoftストアからインストールしたPython 私が回答で利用しているPythonは、(3)です。 (2)または(3)のみにすれば問題の切り分けがし易いですが。 とりあえず、コマンドプロンプト(cmd)上で www/のディレクトリ下で python -m http.server --cgi 8000 とのようにWEBサーバーを起動していると思いますが、WEBサーバーは起動させず、 python cgi-bin\input.py と入力して実行するとどうなりますか。結果を本コメント欄に貼り付けてもらえますか。
dodox86

2020/10/27 01:08

確認のため、一応下は実行していただきたいですが、 > python cgi-bin\input.py > > と入力して実行するとどうなりますか。結果を本コメント欄に貼り付けてもらえますか。 恐らくですが、「where python」コマンドの実行結果からして、1番最初に出力されるAnacondaのPython3が動いてしまっているのだと思います。 WEBサーバーを起動する際、www/ディレクトリ下で C:\Users\sonos\AppData\Local\Programs\Python\Python38\python.exe -m http.server --cgi 8000 と起動するか、 C:\Users\sonos\AppData\Local\Microsoft\WindowsApps\python.exe -m http.server --cgi 8000 とのように、pythonインタープリターのPATHを絶対PATH指定で実行してみてください。 それでもダメなら、Anaconda版をアンインストールするとか、サーチPATH(PATH環境変数)の指定を一時的に無効にして試してみてください。 "http.server"モジュールを利用してのCGIは、それがpythonスクリプトであるならば今、動作させているpythonインタープリターを利用しているようです。 Windows版であればsubprocessで起動しています。(python3の細かいバージョンは違いますが、以下のソース1185行あたりから: https://github.com/python/cpython/blob/master/Lib/http/server.py そのため、"もしかしたら" Anaconda版ではダメなのかもしれません。 いずれにせよ、複数のPython3環境が混在しているのはトラブルのもとなので、自力で解決できないかぎりはあまりお勧めできる環境ではないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問