質問するログイン新規登録
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

解決済

1回答

2392閲覧

Flaskでフォームのactionをurl_forで指定した場合に関数に引数が渡らない

lg_rino

総合スコア19

Flask

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/08/29 01:24

編集2022/08/29 01:32

0

0

前提

Flaskで複数ページにまたがる(回答により分岐する)フォームを作成しています。
最終的に、各ページの回答をまとめてから、処理する関数に渡す予定です。

###困っていること
1ページ目のフォームから、「次へ」ボタンを押した際に、
最初のフォームを表示していたのと同じ関数に引数を渡して場合分けして処理を行いたいと思い、
formタグのaction属性に、url_forで関数と引数を指定したのですが、
送信後も引数が変更されない(デフォルト値のまま)ため、
場合分けがうまくいかず困っています。

PythonもFlaskも初心者のため、根本的に間違っている可能性があるのですが、
検索しても見つけられず…。
よろしくお願いいたします。

該当のソースコード

app.py

python

1@app.route("/", methods=('GET', 'POST')) 2def form(step='start'): 3 if request.method == 'POST': 4 submitted_data = request.form 5 6 if step == 'pre_check': 7 session.permanent = True 8 pre_check_data = request.form 9 session['pre_check_data'] = pre_check_data 10 if pre_check_data.get('hoge_test'): 11 return render_template('hoge.html') 12 else: 13 return render_template('hage.html') 14 else: 15 print(step) 16 return render_template('test.html') 17 18 elif step == 'start': 19 return render_template('form.html')

form.html

html

1<form action="{{ url_for('form', step='pre_check') }}" method="post"> 2 # 略 3 <input type="checkbox" name="hoge_test" id="hoge_test" value="1">hoge基準OK(テスト用) 4 <hr> 5 <input type="submit" value="次へ"> 6</form>

発生するエラー

form.htmlのフォームに記入して、「次へ」を押しても、
引数stepがpre_checkにならず、startのままで、
コンソールにstartと表示され、test.htmlが表示されてしまいます。

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

Python 3.10.4
Flask 2.1.2

-----2022/08/29 10:31追記
「次へ」を押した後の遷移先は
http://127.0.0.1:5000/?step=pre_check
となっているので、全く引数が渡っていないわけではないと思うのですが…。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問にあるコードだと受け取れていない気がします。

提示コードが少なかったので、以下で試しました。

足りないのは、def index2(step='start'):の上にある"/<step>", 部分です。
この部分で受け取る値を指定していますが、質問のコードにはありませんので、毎回step='start'が代入され、必ずstepstartになります。

なお、質問のコードに素直に@app.route("/<step>", methods=('GET', 'POST'))と追加すると、/に引っかからなくなるため、注意してください。

python

1# app.py 2from flask import Flask, request, session, render_template 3 4app = Flask(__name__) 5app.secret_key = 'aaa' 6 7 8@app.route("/", methods=['GET']) 9def index1(step='start'): 10 return render_template('index.html', step=step) 11 12 13@app.route("/<step>", methods=['POST']) 14def index2(step='start'): 15 if request.method == 'POST': 16 submitted_data = request.form 17 18 if step == 'pre_check': 19 session.permanent = True 20 pre_check_data = request.form 21 session['pre_check_data'] = pre_check_data 22 if pre_check_data.get('hoge_test'): 23 return render_template('index.html') 24 else: 25 return render_template('index.html') 26 else: 27 print(step) 28 return render_template('index.html') 29 else: 30 return render_template('index.html') 31 32 33if __name__ == '__main__': 34 app.run()

html

1<!-- index.html --> 2<!DOCTYPE html> 3<html lang="en"> 4<head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7</head> 8<body> 9<form action="{{ url_for('index2', step='pre_check') }}" method="post"> 10 # 略 11 <input type="checkbox" name="hoge_test" id="hoge_test" value="1">hoge基準OK(テスト用) 12 <hr> 13 <input type="submit" value="次へ"> 14</form> 15</body> 16</html>

routeのmethods指定は、公式のサンプルでは()ではなく[]を使っていますので、念のため直しておいた方が良いです。

投稿2022/08/29 04:33

FiroProchainezo

総合スコア2443

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

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

lg_rino

2022/08/30 02:05

丁寧にコードの補足までしていただきありがとうございます。 ルートの指定に、引数を指定するサンプルコードは、色々と目にしていたのですが、 それが引数の受取に必須だとは思わず、「URLを変えたくないし…」と思って採用せずにいました。 一般的に、関数呼び出し時には`hoge(arg)`のような形で、引数を渡すだけで受け取れるので、それでいいのだと思っていたのですが、@app.routeは、デコレーターなので、次に続く関数をラップしており、routeに引数が渡っていないと、次に続く関数にも渡らない、という理解で合っていますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問