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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

ウェブアプリケーション

ウェブアプリケーションとは、ウェブ上でアクセスされるアプリケーションのことを呼びます。この場合におけるウェブとは、インターネットやイントラネット上を意味します。

Q&A

解決済

1回答

2185閲覧

cloud9上におけるpythonウェブアプリの不具合について

keimy

総合スコア7

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

ウェブアプリケーション

ウェブアプリケーションとは、ウェブ上でアクセスされるアプリケーションのことを呼びます。この場合におけるウェブとは、インターネットやイントラネット上を意味します。

0グッド

0クリップ

投稿2017/08/09 14:41

はじめて質問させていただきます。
プログラミング初心者にて知識も表現も拙いのですが、何卒よろしくお願いします。

python3のウェブアプリを作りまして、ローカルでは問題なく動作しているのですが、cloud9のレンタルサーバー上で動かそうとしたところ不具合がありました。
動作方法としてはcgi-binフォルダにpythonスクリプトを入れてcgiで動かしており、ウェブアプリ自体は動作しております。

不具合の内容は「htmlコードを書いたtxtファイルを読み込んで、print(htmlコードの内容)で出力したいが、何も表示されない」というものです。

原因を探るため、シンプルに print("a"), print("あ") などとためしたところ、「a」は表示されましたが「あ」は表示されませんでした。日本語のエンコードの問題だと考え、念のため、cloud9のターミナルでlocaleを全て「"ja_JP.UTF-8"」と変更しました。pythonコードはすべてutf-8で出力するよう統一しております。

ソースコードを以下に記載します。解決方法を教えていただけると幸いです。

#! /usr/bin/env python3
import cgi ; form = cgi.FieldStorage()
import cgitb ; cgitb.enable()
print("Content-Type: text/html ;charset=utf-8") ; print()

formをpythonに受け渡す

LOG_FILE = form.getvalue("file","text/循環器.txt")
search = form.getvalue("search","").strip()
andor = form.getvalue("andor","and")

HTMLを出力

head = "<meta charset='utf-8'><title>PROJECT KEIMY</title><link href='/stylesheet.css' rel='stylesheet' type='text/css'></link>"
body = "<body name='main' style='background:skyblue ; font-size:15'></body>"
print(head)
print(body)
s="あ"
print(s) # 以下割愛しますが、これですら表示されません。s="a"なら表示されます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

cloud9上(apache2)で現象再現しました。
.cgiでの標準出力にてエンコーディングをUTF-8と指定することで日本語が表示されるようになりました。
参考:Python3で作る簡素なCGI

test.cgi

Python

1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4import cgi 5form = cgi.FieldStorage() 6import cgitb 7cgitb.enable() 8 9# 標準出力の文字コードをUTF-8に 10import sys,io 11sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 12 13print('Content-type: text/html; charset=UTF-8') 14print() 15# HTMLを出力 16print('<!DOCTYPE html><html lang="ja"><head><meta charset="utf-8"><title>ページタイトル</title></head><body>') 17s="あいうえお" 18print(s) 19print('</body></html>')

投稿2017/08/09 16:32

can110

総合スコア38233

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

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

keimy

2017/08/09 17:56

的確な回答ありがとうございます。 回答していただいた記述を追加したことで「print("あ")」などの表示が可能になりました。 当初の質問は解決したのですが、肝心のWebアプリがいまだに動作しません、、 エンコード無関係に何か問題がある可能性もあり、引き続き御指摘いただけると助かります。 以下に残りのソースコードをはります。拙いコードですがお願いいたします。 # 以下はログファイルに影響しない。 with open(LOG_FILE, mode="r",encoding="euc-jp") as f: print("あああ") # linesはindex付加したリスト、anssは最終的な出力リスト lines=[]; anss=[]; index=1 for line in f: line = str(index)+" "+line; lines.append(line); index+=1 # revコマンド:古い順に表示 if "rev" in search: search = search.replace("rev","").strip() ;lines.reverse() else: pass # 基本状態=空白入力:全表示 if search=="" and andor!="rate": anss=lines # and検索: elif search != "" and andor=="and": searches = search.split() # 空白区切でsearchesリストに格納 for line in lines: flag = True for search in searches: if search in line: line = line.replace(search,"<a>"+search+"</a>") else: flag = False ; break if flag: anss.append(line); # or検索: elif search != "" and andor=="or": searches = search.split() # 空白区切でsearchesリストに格納 for line in lines: flag = False for search in searches: if search in line: line = line.replace(search,"<a>"+search+"</a>") ; flag = True if flag: anss.append(line); # レート検索: elif andor=="rate": searches=[] try: search = [int(i) for i in search.split()] if len(search)==1: min=search[0]; max=100 elif len(search)==2: min=search[0]; max=search[1] if min>max or min<0 or max>100: print("Invalid Value !<br>"); min=90; max=100 except: min=90; max=100 print("正答率"+str(min)+"%-"+str(max)+"%:") for i in range(min,max+1): searches.append("正答率"+str(i)+".") for line in lines: flag = False if "正答率100" in line: line = "<a>【100%】</a>"+line; for search in searches: if search in line: line = line.replace(search,"<a>"+search+"</a>") ; flag = True if flag: anss.append(line); # 出力 total=len(lines); hit=len(anss); r=int(hit/total*100) print(str(hit)+" / "+str(total)+" ("+str(r)+"%)") for ans in anss: print("<hr>"+ans)
keimy

2017/08/09 18:07 編集

すいません、インデントが崩れていまいました、、 別の質問という形で再度お願いできますでしょうか? 今回のひとまずベストアンサーにさせていただきます!
can110

2017/08/09 23:58

別質問の件、了解しました。 cloud9やapacheには詳しくないので、分かる範囲で回答できればと思います。
keimy

2017/08/10 07:35

ベストアンサーにさせていただきました。 別質問ですが 「cloud9上におけるpythonウェブアプリの不具合について(つづき)」 というタイトルで投稿させていただきました。 お手数おかけして申し訳ありませんが、よければ宜しくお願いいたします。
can110

2017/08/10 09:24

つづきのほうの質問にコメント入れました。 apacheログに何らかエラー(日本語ファイル名あたり?)出ているかと思いますので提示されると回答得られやすいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問