🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

1回答

20120閲覧

python Flaskで、ボタンを押したら○○する、というような動作について

br26tg26

総合スコア1

Python

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

0グッド

0クリップ

投稿2020/12/18 04:54

前提・実現したいこと

pythonを勉強して1か月も経ってないくらいでまだよく知らないので質問です。
自分で調べて以下の書き方なら動く、というものは見つけたのですが、
これ以外にも同じ動作をする書き方があれば教えていただきたいです。

以下のコードは、例として3つのボタンを用意し、
それぞれ「12345」「67890」「1234567890」と表示します。(問題なく動いてます)

該当のソースコード

python

1from flask import Flask, render_template, request 2 3app = Flask(__name__) 4 5@app.route("/", methods=["GET", "POST"]) 6def index(): 7 if request.method == 'POST': 8 if request.form['send'] == 'aaa': 9 m = '12345' 10 return render_template('index.html', message=m) 11 12 if request.form['send'] == 'bbb': 13 m = '67890' 14 return render_template('index.html', message=m) 15 16 if request.form['send'] == 'ccc': 17 m = '1234567890' 18 return render_template('index.html', message=m) 19 else: 20 return render_template('index.html') 21 22if __name__ == "__main__": 23 app.run(host = '0.0.0.0', port = '5000')

html

1<!DOCTYPE html> 2<html> 3 <head> 4 </head> 5 <body> 6 <p>{{ message }}</p> 7 <form method="POST"> 8 <input type="submit" name="send" value="aaa"> 9 <input type="submit" name="send" value="bbb"> 10 <input type="submit" name="send" value="ccc"> 11 </form> 12 </body> 13</html> 14

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

python 3.8.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • request.form['send']value = request.form.get('send', None)のように書く事もできます。
    sendが無い場合Exceptionになると思うので、無い場合にNoneを取得し、まずNoneであるか確認する手順を踏むと良いと思います。

  • 以下の部分は都度returnを書かず、全ての判定が終わった後でreturn render_template('index.html', message=m)と書いても同じ動作になるはずです。(どっちの書き方が良いかはコーディング規則によると思いますが)
    POSTで遷移してきてsendがaaaでもbbbでもcccでもない場合、returnが無いのでExceptionになると思いますので、aaaでもbbbでもcccでもない場合に備えた処理を追加しましょう。(mが無い場合に備えてください)

python

1 if request.form['send'] == 'aaa': 2 m = '12345' 3 return render_template('index.html', message=m) 4 5 if request.form['send'] == 'bbb': 6 m = '67890' 7 return render_template('index.html', message=m) 8 9 if request.form['send'] == 'ccc': 10 m = '1234567890' 11 return render_template('index.html', message=m)
  • return render_template('index.html')はmessageが存在しないので、Jinja2側でエラーになる気がするのですが、なっていませんか?
    htmlのmessage部分に例えば{% if message %}の様な判定を追加した方が良いかもしれません。

  • <form method="POST">はaction属性を追加した方が良いです。
    その際<form method="POST" action="{{ url_for('index') }}">のような感じで、urlを直接書くのではなくurl_forを使いましょう。

Webでは入力が正しく無いと思って処理するのが基本ですので、その辺の処理を考えると良いかもしれません。

投稿2020/12/21 01:55

FiroProchainezo

総合スコア2421

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問