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

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

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

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

Q&A

解決済

1回答

11070閲覧

【Python】htmlがweb上で表示されない。

fk_junya

総合スコア7

Python

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

0グッド

0クリップ

投稿2018/03/06 12:32

参考書先々週に買い、プログラミングを始めたてのものです。
以下のプログラム(一行でのチャット)を動かしてみる過程で行き詰まりました。一日かけてもわからなかったので質問させていただきます。

Windows PowerShellで簡易サーバー(localhost:8080)を作った後、webで表示しようとしても画面が真っ白なままです。この時PowerShellには

CGI script exited OK

と表示されています。
python3.6、での稼働です。
どのようにすれば文字化けもなくきれいに表示できるのでしょうか。
回答よろしくお願いいたします。

#!/usr/bin/env python3 import cgi import cgitb import os.path import html #ブラウザーでのデバックを有効にする cgitb.enable() #全体の設定 FILE_LOG = "chat-log.txt" #HTMLを画面に表示する def print_html(body): #ヘッダーを出力 print("Content-Type: text/html; charset=utf-8") print("") #HTMLを出力 print (""" <html><head><meta charset="utf-8"> <title>チャット</title></head><body> <h1>チャット</h1> <div><form> 名前 : <input type="text" name="name" size ="8"> 本文 : <input type="text" name="body" size ="20"> <input type="submit" value="発言"> <input type="hidden" name="mode" value="write"> </form></div><hr> {0} </body></html> """.format(body)) #チャットに書き込みログを表示する def mode_read(form): #ログを読み取る log ="" if os.path.exists(FILE_LOG): with open(FILE_LOG,"r",encoding="utf-8") as f: log = f.read() print_html(log) #任意のURLにジャンプする def jump(url): #ヘッダー出力 print("status: 301 Moved permanently") print("Location:" + url) print("") #HTMLを出力(ヘッダーがうまくいかなかった時の対策) print('<html><head>') print('<meta http-equiv="refresh" content="0;'+url+'">') print('</head><body>') print('<a href="'+url+'">jump</a></body></html>') #メッセージの書き込み def mode_write(form): #パロメーターの取得 name=form.getvalue("name","no name") body=form.getvalue("body","") #HTMLに変換 name=html.escape(name) body=html.escape(body) #ファイルに保存 with open(FILE_LOG, "a+", encoding='utf-8') as f: f.write("<p>{0}:{1}</p><hr>\n".format(name,body)) #書き込み後にリダイレクト jump('chat.py') #メイン処理 def main(): #フォームの値を取得 form=cgi.FieldStorage() #modeパラメータを取得 mode=form.getvalue("mode","read") #modeの値によって処理を変更 if mode =="read": mode_read(form) elif mode =="write": mode_write(form) else: mode_read(form) if __name__=="__main__": main()

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

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

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

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

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

guest

回答1

0

ベストアンサー

参考書の内容に関しては参考書の出版社に問い合わせをしたほうが良いと思いますが。

質問文のcgiスクリプトをデバック実行して確認した処
mode_read関数内で呼び出しているのprint_html関数のインデントが正しくありません。(1個深い)
print_htmlでHTMLデータを表示しているため、ログファイルが存在しない時にHTMLデータが表示されません。

Note

1Note:もしくはログファイルが存在するのが前提のソースコードなのかもしれません。 2参考書にその旨記載してませんでしたか?

以下はインデントを修正後のソースコードです。

Python

1def mode_read(form): 2 #ログを読み取る 3 log ="" 4 if os.path.exists(FILE_LOG): 5 with open(FILE_LOG,"r",encoding="utf-8") as f: 6 log = f.read() 7 print_html(log)

■実行フォルダ構成は以下の形になると思われます。

txt

1/ 2├─ cgi-bin …フォルダなければ作成 3│ └─chat.py …質問文のソースコードを設置 4├─ chat-log.txt … チャットログ なければ作成 5└─ この位置で コマンドプロンプトより py.exe -m http.server --cgi 8080 のコマンドを実行する。

アクセス先

投稿2018/03/06 20:48

編集2018/03/06 21:19
umyu

総合スコア5846

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

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

fk_junya

2018/03/07 01:17 編集

ご回答ありがとうございます。 インデントを改善したとこで画面に表示はできました。Pythonではインデントが重要なのを痛感いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問