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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

Python

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

Q&A

解決済

2回答

4177閲覧

Python3でランダム関数利用のweb版じゃんけんゲームの添削をお願いいたします。

reok

総合スコア5

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

Python

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

1グッド

1クリップ

投稿2020/03/18 00:32

編集2020/03/19 05:58

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
Python3でflaskを利用してWEBでじゃんけんゲームを実行するプログラム
を作成したのでpostで受け取るgetの遷移後のプログラムを実行する部分がどうしても
上手く実行できない為添削をお願いします。

発生している問題・エラーメッセージ

---起きている事象--- プルダウンのグーを選択後、じゃんけんぽんのボタンsubmit後 Internal Server Error となってしまいます。 ---エラーコード--- File "c:/Users/test/server.py", line 19, in post pc = janken[random.choice(choice_list)] TypeError: string indices must be integers

該当のソースコード

from flask import Flask, render_template, request import random app = Flask(__name__) @app.route('/', methods=['GET']) def get(): return render_template('index.html', \ title = 'Form Sample(get)', \ message = 'じゃんけんをはじめます') @app.route('/', methods=['POST']) def post(): radio = {"1": "グー","2": "チョキ","3": "パー"} user = request.form.get('janken') user_choice = radio[user] choice_list = ["1", "2", "3"] pc = radio[random.choice(choice_list)] draw = 'DRAW' win = 'You Win!!' lose = 'You lose!!' if user_choice == pc: judge = draw else: if user_choice == "グー": if pc == "チョキ": judge = win else: judge = lose elif user_choice == "チョキ": if pc == "パー": judge = win else: judge = lose else: if pc == "グー": judge = win else: judge = lose return render_template('index.html', \ title = 'Form Sample(get)', \ message = "結果は%s" % judge ,radio=radio,judge=judge) if __name__ == '__main__': app.run()

該当のソースコード

<body> <h1>{{ title }}</h1> <p>{{ message }}</p> <form action="/" method="POST" enctype="multipart/form-data"> <div> <label for="r1">グー:</label> <input type="radio" id="r1" name="janken" value="1"> </div> <div> <label for="r2">チョキ:</label> <input type="radio" id="r2" name="janken" value="2"> </div> <div> <label for="r3">パー:</label> <input type="radio" id="r3" name="janken" value="3"> </div> <div> <input type="submit" value="じゃんけんぽん!"> </div> </form> </body>

試したこと

1画面目までは表示しますが2画面目以降の
実行箇所にてエラーになってしまいます。

補足情報(FW/ツールのバージョンなど)

Python3.7.7

Lhankor_Mhy👍を押しています

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

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

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

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

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

Lhankor_Mhy

2020/03/18 00:45

「どうしても上手く実行できない」とのことですが、具体的には何が起きていて、本当はどうしたいのですか? 3-3. 質問詳細の最初に実現したいことを書きましょう https://teratail.com/help/question-tips#questionTips3-3 結果(実際に起きたこと)を書きましょう https://teratail.com/help/question-tips#questionTips3-4-1 エラーメッセージや実行ログをコピー&ペーストしましょう https://teratail.com/help/question-tips#questionTips3-4-2 期待した処理結果を書きましょう https://teratail.com/help/question-tips#questionTips3-4-3
reok

2020/03/18 00:57

エラー箇所は下記です。 line 46 return render_template('index.html', ^ SyntaxError: 'return' outside function 期待値:実際の結果はwebにて1画面でチェックボックスで選択したじゃんけんの手を2画面目にてじゃんけんの手の勝敗結果を表示させる挙動です。python始めたてで、じゃんけんプログラムをwebで実行したかったのですが上手く書けなかったので、本質問させていただきました。
Lhankor_Mhy

2020/03/18 00:58

私以外の回答が必要なら、質問に追記することをお勧めします。
reok

2020/03/18 01:16

実行に至っていないので他の回答があればお願いします。
Lhankor_Mhy

2020/03/18 01:37

私の回答を元にご修正はされましたか?
reok

2020/03/18 02:15

インデントは揃えてデコーレタの箇所、定義箇所修正済みです。
Lhankor_Mhy

2020/03/18 02:21

それでもエラーが取れないのですね? では、コードとエラーメッセージをご提示いただけますか?
reok

2020/03/18 03:03

修正後のコードは以下になります。htmlは編集しておりません。 エラーがhtml側でおきております。 ------------------------- Method Not Allowed The method is not allowed for the requested URL. ``` from flask import Flask, render_template, request import random app = Flask(__name__) @app.route('/', methods=['GET']) def get(): return render_template('index.html', \ title = 'Form Sample(get)', \ message = 'じゃんけんをはじめます') @app.route('/zyanken', methods=['POST']) def post(): radio = {"1": "グー","2": "チョキ","3": "パー"} name = request.form.get('radio') user_choice = radio[name] choice_list = ["1", "'2", "3"] pc = name[random.choice(choice_list)] if user_choice == pc: judge = name_3 else: if user_choice == "グー": if pc == "チョキ": judge = name_1 else: judge = name_2 elif user_choice == "チョキ": if pc == "パー": judge = name_1 else: judge = name_2 else: if pc == "グー": judge = name_1 else: judge = name_2 name = request.form.get('radio' ) return render_template('index.html', name=name, title=title) if __name__ == '__main__': app.run() ```
Lhankor_Mhy

2020/03/18 03:11

ご存知の通り、pythonのコードはインデントが文法に含まれていますので、これでは評価できません。 繰り返しになりますが、他の回答者の目に触れるためにも、質問の追記をお勧めします。
reok

2020/03/18 06:03

ソースの修正と発生しているエラーの追記をさせて頂きました。
Lhankor_Mhy

2020/03/18 06:23

拝読。 エラーメッセージは、その後に、KeyError: None と続いていませんか?
reok

2020/03/18 06:38

はい。KeyError: Noneと出力されております。
Lhankor_Mhy

2020/03/18 08:12

それは重要な情報ですので、次からはそれも記載してください。
reok

2020/03/18 10:17

かしこまりました。また頂いた回答をもとに再度html側を修正いたしました。 結果はKeyError: 'on' 出力されております。他に修正箇所があればご教授お願い致します。
reok

2020/03/19 05:57

コネコネ修正していましたら期待値が出力できました。色々ご指導、添削頂きありがとうございます。 また修正後のソースも載せております。
Lhankor_Mhy

2020/03/19 08:45

お見事です。 正直言って、当初の状況から、reokさんは動くものができるところまでたどり着けないだろう、と思っていました。 あそこからここまで短時間でやり遂げたことに感服しました。すごいです。
guest

回答2

0

添削以前の問題で、インデントが正しく無いので動かないんじゃないですか?
インデントをそろえてください。

また、コメントにエラーメッセージについてのやりとりがありますが、エラーメッセージは省略することなく全文を記載してください。

投稿2020/03/18 01:41

FiroProchainezo

総合スコア2421

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

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

0

ベストアンサー

ひとまず、文法的に気になったところを。

python

1@zyanken.py 2from flask import Flask, render_template, request

fromの前にデコレータをつけるのは初めて見ました。これは正しいのですか?

python

1def post(): 2 3 4 radio = {"1": "グー","2": "チョキ","3": "パー"}

インデントがそろっていません。この行以降もインデントレベルが合っていないように思えます。

python

1 judge = radio_3

radio_3は未定義では。
その他、定義されていない変数がたくさんありますが、もしかして、これはリストの添え字ですか?
reokさんは、プログラミング初学者ですか? 「リストとは何か」から説明する必要がありますか?

質問の補足を受けて追記

エラーがhtml側でおきております。

Method Not Allowed
The method is not allowed for the requested URL.

html

1 <form action="/" method="POST" enctype="multipart/form-data">

python

1@app.route('/zyanken', methods=['POST'])

URLが間違っているように思えます。

質問の編集を受けて追記

File "c:/Users/test/server.py", line 16, in post
user_choice = radio[name]

ラジオボタンのHTMLの書き方が間違っています。name_3のような属性は有効ではありません。
<INPUT type="radio">-HTMLタグリファレンス

質問の編集を受けて追記2

File "c:/Users/test/server.py", line 16, in post
user_choice = radio[janken]
KeyError: 'on'

html

1<input type="radio" id="r1" name="janken" value1="勝ち">

value属性をつけましょう。

HTML で value 属性を省略すると、送信されたフォームデータのそのグループには on の値が割り当てられます。

<input type="radio"> - HTML: HyperText Markup Language | MDN

reokさんは、Pythonやる前に、まずきちんとHTMLを学んだ方がいいのかもしれないですね。

コメントを受けて追記

File "c:/Users/test/server.py", line 16, in post
user_choice = radio[janken]
KeyError: '勝利'

radio変数は辞書型なので、存在しないキーでアクセスするとエラーになります。

python

1radio = {"1": "グー","2": "チョキ","3": "パー"}

↑この場合、アクセスできるキーは"1" "2" "3"です。しかし、request.form.get('janken')で取得する値は、"勝利" "負け" "引き分け"ですから、値の設定を見直す必要があるでしょう。

参考:
とっても便利なPythonの辞書型について覚え書き - Qiita

コメントを受けて追記2

出力結果は型エラーがでたので文字型ではなく数値にキーを設定しても同様のエラーとなっております。
型が間違っているのでしょうか。

その通りです。

python

1choice_list = ["1", "2", "3"]

"1"は数値ではなく、文字列です。

ただ、これ、数値に直しても、janken変数に入っているのは"勝利"なので、janken[1]"利"です。
reokさんの想定と違うのではありませんか?

投稿2020/03/18 00:56

編集2020/03/19 03:22
Lhankor_Mhy

総合スコア36896

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

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

reok

2020/03/19 00:01

value属性を修正いたしましたが変わらずkeyerrorとなってしまいます。 >File "c:/Users/test/server.py", line 16, in post >user_choice = radio[janken] KeyError: '勝利'
reok

2020/03/19 01:35

追記ありがとうございます。 変数の辞書型のアクセスキーを修正いたしました。 出力結果は型エラーがでたので文字型ではなく数値にキーを設定しても同様のエラーとなっております。 型が間違っているのでしょうか。 File "c:/Users//test/server.py", line 19, in post pc = janken[random.choice(choice_list)] TypeError: string indices must be integers
reok

2020/03/19 06:30 編集

コネコネ修正していましたら期待値が出力できました。色々ご指導、添削頂きありがとうございます。 また修正後のソースも載せております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問