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

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

詳細はこちら
Flask

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python 3.x

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

Python

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

Q&A

解決済

3回答

6938閲覧

formが2つ以上ある時のPOST送信

pocoapoco3

総合スコア6

Flask

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/02/04 02:27

前提・実現したいこと

ページ上にFormが二つある時、一つ目のPOSTはうまく機能するのですが、二つ目の方が機能しません。

該当のソースコード

Python

1# -*- coding: utf-8 -*- 2from flask import Flask, render_template, request 3 4app = Flask(__name__) 5 6@app.route('/') 7def index(): 8 return render_template('index01.html') 9 10@app.route('/', methods=['POST']) 11def post(): 12 product0 = request.form.get('product0') 13 return render_template('index01.html', product_0 = product0) 14 15@app.route('/', methods=['POST']) 16def post1(): 17 product1 = request.form.get('product1') 18 return render_template('index01.html', product_1 = product1) 19 20if __name__ == '__main__': 21 app.run() 22

HTML

1<!doctype html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 6 <title>テスト</title> 7 </head> 8 <body> 9 <h1>商品作成</h1> 10 <form action="/" method="POST" enctype="multipart/form-data"> 11 <label>商品名:<input type="text" name="product0" place></label> 12 <input type="submit" value="送信"> 13 </form> 14 <div> 15 <h2>作成された商品</h2> 16 <p>商品名: {{product_0}}</p> 17 </div> 18 <div> 19 <h2>商品作成2</h2> 20 <form action="/" method="POST" enctype="multipart/form-data"> 21 <label>商品名:<input type="text" name="product1" place></label> 22 <input type="submit" value="送信"> 23 </form> 24 </div> 25 <div> 26 <h2>検索結果</h2> 27 <p>商品名: {{product1}}</p> 28 </div> 29 </body> 30</html> 31

試したこと

結果:
商品作成で入れた値は表示されるが、商品作成2で入れた値は表示されない。

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

Python3
Flask
Terminal

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

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

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

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

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

guest

回答3

0

ベストアンサー

やってみました。

flaskで同じroute('/')で同じメソッド(POST)に別関数を割り振った場合、app.url_mapでは以下になっていました。

Map([<Rule '/' (GET, HEAD, OPTIONS) -> index>, <Rule '/' (POST, OPTIONS) -> post>, <Rule '/' (POST, OPTIONS) -> post1>, <Rule '/static/<filename>' (GET, HEAD, OPTIONS) -> static>])

/でどちらもアクセスできるように見えますが、実際にPOSTするとpost()の方だけがひっかかるようです。
(上から順番に評価でもしてるんでしょうね)

というわけで、同じフォームにまとめて送ってまとめて処理するか、エンドポイントを変える(/post/post1にするとか)か等、対策をお願いします。

投稿2021/02/04 06:48

FiroProchainezo

総合スコア2421

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

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

0

複数フォームに飛ばしたいなら

  • formにtargetを設定して別のwindowにとばす
  • 遷移したいfrom以外は非同期処理でおこなう
  • サーバーサイドで振り分ける

などが考えられます

投稿2021/02/04 03:20

yambejp

総合スコア116694

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

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

0

Pythonは分からないですが、Webの観点から。

formは自身に所属する入力コントロールしか送信できないので、全部配下に入れた上で、name属性の属性値を配列にし、受け取って処理させると良いです。

<input type="text" name="product[]" place>

投稿2021/02/04 02:48

m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問