Python enctype="multipart/form-data"をコードに追加後、入力フォームの文字が認識されなくなった
受付中
回答 1
投稿
- 評価
- クリップ 0
- VIEW 209

退会済みユーザー
前提・実現したいこと
Pythonの勉強を初めて2週間程度の超初心者です。質問の内容におかしな点がございましたらご了承くださいませ。
初心者向けの教本を用いて勉強をしています。特定の文字を入力すると、それに対応するレスポンスを返すアプリケーションを作成しました。例えば、「今日」と入力すると今日の日付を返すようになっています。
ブラウザ上はしたの画像のようになっています。
発生している問題・エラーメッセージ
下のコードがテンプレートファイルの中身です。
enctype="multipart/form-data"をformに追加後、「メッセージを入力してください」のフォームに文字を入力しても、認識されなくなった
→教本のなかで、画像を送信できるようフォームにenctype="multipart/form-data"を追加しました。特定のコマンド(今日、辞書など)以外、「何ヲ言ッテルカ、ワカラナイ」と返るようになっています。これまできちんと動作していましたが、enctype~を追加後、何を入力しても「何ヲ言ッテルカ、ワカラナイ」が返るようになりました。
<html>
<body>
<h1>pybot Webアプリケーション</h1>
<form method="post" action="/hello" enctype="multipart/form-data">
メッセージを入力してください: <input type="text" name="input_text"><br>
画像を選択してください: <input type="file" name="input_image"><br>
<input type="submit" value="送信">
</form>
<ul>
<li>フォームに入力されたメッセージ: {{input_text}}</li>
<li>pybotからの応答メッセージ: {{!output_text}}</li>
</ul>
</body>
</html>
該当のソースコード
テンプレートファイル
<html>
<body>
<h1>pybot Webアプリケーション</h1>
<form method="post" action="/hello" enctype="multipart/form-data">
メッセージを入力してください: <input type="text" name="input_text"><br>
画像を選択してください: <input type="file" name="input_image"><br>
<input type="submit" value="送信">
</form>
<ul>
<li>フォームに入力されたメッセージ: {{input_text}}</li>
<li>pybotからの応答メッセージ: {{!output_text}}</li>
</ul>
</body>
</html>
サーバーを起動するためのファイル
from bottle import route, run, template, request
from pybot import pybot
@route('/hello')
def hello():
return template('pybot_template', input_text='', output_text='')
@route('/hello', method='POST')
def do_hello():
input_text = request.forms['input_text']
input_image = request.files.input_image
output_text = pybot(input_text, input_image)
return template('pybot_template', input_text=input_text, output_text=output_text)
run(host='localhost', port=8080, debug=True)
アプリケーション本体
from pybot_eto import eto_command
from pybot_random import choice_command, dice_command
from pybot_datetime import today_command, now_command, weekday_command
from pybot_wikipedia import wikipedia_command
def len_command(command):
cmd, text = command.split()
length = len(text)
response = '文字列ノ長サハ {} 文字デス'.format(length)
return response
def heisei_command(command):
heisei, year_str = command.split()
if year_str.isdigit():
year = int(year_str)
if year >= 1989:
heisei_year = year - 1988
response = '西暦{}年ハ、平成{}年デス'.format(year, heisei_year)
else:
response = '西暦{}年ハ、平成デハアリマセン'.format(year)
else:
response = '数値ヲ指定シテクダサイ'
return response
command_file = open('pybot.txt', encoding='utf-8')
raw_data = command_file.read()
command_file.close()
lines = raw_data.splitlines()
bot_dict = {}
for line in lines:
word_list = line.split(',')
key = word_list[0]
response = word_list[1]
bot_dict[key] = response
def pybot(command):
# command = input('pybot> ')
response = ''
try:
for message in bot_dict:
if message in command:
response = bot_dict[message]
break
if '長さ' in command:
response = len_command(command)
if '平成' in command:
response = heisei_command(command)
if '干支' in command:
response = eto_command(command)
if '選ぶ' in command:
response = choice_command(command)
if 'サイコロ' in command:
response = dice_command()
if '今日' in command:
response = today_command()
if '現在' in command:
response = now_command()
if '曜日' in command:
response = weekday_command(command)
if '辞典' in command:
response = wikipedia_command(command)
if not response:
response = '何ヲ言ッテルカ、ワカラナイ'
return response
# if 'さようなら' in command:
# break
except Exception as e:
print('予期せぬエラーが発生しました')
print('* 種類:', type(e))
print('* 内容', e)
試したこと
web上で同様の問題を探してみたのですが、見つけることができませんでした。
そもそも私の知識が乏しいあまりにどういう問題が起きているのかを把握できておりません・・・
どなたかわかる方いらっしゃいましたら御助力のほどよろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
ご提示のソースコードだと、動作させることができませんでした。
本当にこれが最新版ですか?
現象が再現する最小限のソースコードをご提供いただけませんか。
bottleには詳しくありませんが、適当に削除して動かしてみたところ、[/hello]のPOST呼び出しの以下部分でError: 500 Internal Server Errorになりました。
# サーバーを起動するためのファイル
output_text = pybot(input_text, input_image)
引数の数があっていないようです。
# アプリケーション本体
def pybot(command):
以下が返ってきますか?
何を入力しても「何ヲ言ッテルカ、ワカラナイ」が返るようになりました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/08/20 18:29
上のコードに一部間違いがございました。申し訳ございません。下記コードで再度見てみていただけますでしょうか。
○pybot2.py --アプリケーション本体
=========================
def len_command(command):
cmd, text = command.split()
length = len(text)
response = '文字列ノ長サハ {} 文字デス'.format(length)
return response
def heisei_command(command):
heisei, year_str = command.split()
if year_str.isdigit():
year = int(year_str)
if year >= 1989:
heisei_year = year - 1988
response = '西暦{}年ハ、平成{}年デス'.format(year, heisei_year)
else:
response = '西暦{}年ハ、平成デハアリマセン'.format(year)
else:
response = '数値ヲ指定シテクダサイ'
return response
command_file = open('pybot.txt', encoding='utf-8')
raw_data = command_file.read()
command_file.close()
lines = raw_data.splitlines()
bot_dict = {}
for line in lines:
word_list = line.split(',')
key = word_list[0]
response = word_list[1]
bot_dict[key] = response
def pybot(command):
# command = input('pybot> ')
response = ''
try:
for message in bot_dict:
if message in command:
response = bot_dict[message]
break
if '長さ' in command:
response = len_command(command)
if '平成' in command:
response = heisei_command(command)
if '干支' in command:
response = eto_command(command)
if '選ぶ' in command:
response = choice_command(command)
if 'サイコロ' in command:
response = dice_command()
if '今日' in command:
response = today_command()
if '現在' in command:
response = now_command()
if '曜日' in command:
response = weekday_command(command)
if '辞典' in command:
response = wikipedia_command(command)
if not response:
response = '何ヲ言ッテルカ、ワカラナイ'
return response
# if 'さようなら' in command:
# break
except Exception as e:
print('予期せぬエラーが発生しました')
print('* 種類:', type(e))
print('* 内容', e)
======================
○pybotweb.py --サーバーを起動するためのファイル
======================
from bottle import route, run, template, request
from datetime import datetime
from pybot2 import pybot
@route('/hello')
def hello():
return template('pybot_template', input_text='', output_text='')
@route('/hello', method='POST')
def do_hello():
input_text = request.forms.input_text
output_text = pybot(input_text)
return template('pybot_template', input_text=input_text, output_text=output_text)
run(host='localhost', port=8080, debug=True)
========================
○pybot_template.tpl --テンプレートファイル
========================
<html>
<body>
<h1>pybot Webアプリケーション</h1>
<form method="post" action="/hello" enctype="multipart/form-data">
メッセージを入力してください: <input type="text" name="input_text"><br>
画像を選択してください: <input type="file" name="input_image"><br>
<input type="submit" value="送信">
</form>
<ul>
<li>入力されたメッセージ: {{input_text}}</li>
<li>pybotからの応答メッセージ: {{!output_text}}</li>
</ul>
</body>
</html>
========================
○pybot.txt --特定の言葉に対する返答を記載したファイル
========================
こんにちは,コンニチハ
ありがとう,ドウイタシマシテ
さようなら,サヨウナラ
========================
2020/08/20 18:34
が、現状では何を打ってもおそらく'何ヲ言ッテルカ、ワカラナイ'が返ります。
pybot_template.tplの<form method="post" action="/hello" enctype="multipart/form-data">の部分から、enctype="multipart/form-data"を消すと、正常に機能します。
長々と申し訳ございません。ご確認いただけますでしょうか。
2020/08/21 09:24
コメント欄ではインデントを保持したままcodeを表示することができません。
質問文を修正し、最新のコードをご提供いただけますか。