前提・実現したいこと
ここに質問の内容を詳しく書いてください。
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
「どうしても上手く実行できない」とのことですが、具体的には何が起きていて、本当はどうしたいのですか?
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
エラー箇所は下記です。
line 46 return render_template('index.html',
^ SyntaxError: 'return' outside function
期待値:実際の結果はwebにて1画面でチェックボックスで選択したじゃんけんの手を2画面目にてじゃんけんの手の勝敗結果を表示させる挙動です。python始めたてで、じゃんけんプログラムをwebで実行したかったのですが上手く書けなかったので、本質問させていただきました。
私以外の回答が必要なら、質問に追記することをお勧めします。
実行に至っていないので他の回答があればお願いします。
私の回答を元にご修正はされましたか?
インデントは揃えてデコーレタの箇所、定義箇所修正済みです。
それでもエラーが取れないのですね?
では、コードとエラーメッセージをご提示いただけますか?
修正後のコードは以下になります。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()
```
ご存知の通り、pythonのコードはインデントが文法に含まれていますので、これでは評価できません。
繰り返しになりますが、他の回答者の目に触れるためにも、質問の追記をお勧めします。
ソースの修正と発生しているエラーの追記をさせて頂きました。
拝読。
エラーメッセージは、その後に、KeyError: None と続いていませんか?
はい。KeyError: Noneと出力されております。
それは重要な情報ですので、次からはそれも記載してください。
かしこまりました。また頂いた回答をもとに再度html側を修正いたしました。
結果はKeyError: 'on' 出力されております。他に修正箇所があればご教授お願い致します。
コネコネ修正していましたら期待値が出力できました。色々ご指導、添削頂きありがとうございます。
また修正後のソースも載せております。
お見事です。
正直言って、当初の状況から、reokさんは動くものができるところまでたどり着けないだろう、と思っていました。
あそこからここまで短時間でやり遂げたことに感服しました。すごいです。
回答2件
あなたの回答
tips
プレビュー