🐷

Flaskで複数のフォームからPOSTで受けたいとき

2023/01/24に公開

pythonとflaskで書いたウェブアプリでエラーが出たので、修正作業を続けています。
その中で、複数のページに設定したフォームからPOSTで送ってきたデータを受け取ることが思うようにできなかったのです。
ChatGPTに、コードの確認をしてもらったことで、意図した通りにデータの受け取りが出来るようになりました。
私のようにFlaskで複数のフォームからのデータの受け取りに悩んでいる人が居たら、役立てて頂けたらと思い記事に書きました。

以下ChatGPTの回答を原文のまま掲載します。

This code is a Flask application that has three routes: "/app", "/app" and "/about".
The first route "/app" handles the form submission from the index page, it retrieves the form data and depending on the select_form_id value it redirects the user to either "kisyu_form.html", "uma_form.html" or "no-kakusu.html".
The second route "/app" handles the form submission from the kisyu_form.html, it retrieves the form data and performs some logic with the data and redirects the user to either "kisyu_kantei.html" or "errer.html"
The third route "/app" handles the form submission from the uma_form.html, it retrieves the form data and performs some logic with the data and redirects the user to either "uma_kantei.html" or "errer.html"

It seems that the problem you are facing is that the form submissions are not redirecting the user to the correct page. One issue that could be causing this is that you are using the same route ("/app") for multiple functions. In Flask, route names must be unique, so you should use different routes for each of the form handlers.

Try changing the routes to:

@app.route("/kakusu_select", methods=['GET', 'POST'])
def kakusu_select():
    # same code

@app.route("/kisyu_form", methods=['GET', 'POST'])
def kisyu_form():
    # same code

@app.route("/uma_form", methods=['GET', 'POST'])
def uma_form():
    # same code

DeppLで翻訳した結果です。
このコードは、Flaskアプリケーションで、3つのルートを持っています。「/app"、"/app"、"/about "です。
最初のルート「/app」は、インデックスページからのフォーム送信を処理し、フォームデータを取得し、select_form_idの値に応じて、ユーザを「kisyu_form.html」「uma_form.html」「no-kakusu.html」のいずれかにリダイレクトしています。
2番目のルート「/app」は、kisyu_form.htmlからのフォーム送信を処理し、フームデータを取得し、そのデータを使っていくつかのロジックを実行し、ユーザーを「kisyu_kantei.html」または「errer.html」のいずれかにリダイレクトさせます。
3番目のルート "/app" は、uma_form.html からのフォーム送信を処理し、フォームデータを取得し、そのデータを使っていくつかのロジックを実行し、ユーザーを "uma_kantei.html"、または "errer.html" にリダイレクトさせます。

あなたが直面している問題は、フォーム送信によってユーザーが正しいページにリダイレクトされないことだと思われます。この原因として考えられるのは、複数の関数に同じルート("/app")を使っていることです。Flask では、ルート名は一意でなければならないので、フォームハンドラごとに異なるルートを使用する必要があります。

ルートを変更してみてください。

ルート名は一意でなければいけない

このルート名は、一意でないといけないということをChatGPTが、ちゃんと理解しているようです。
ChatGPTですべての回答を得られるわけではないので、Google検索もします。
でも、誰にも相談できず、テラテイルなどに投稿しても回答を得られないとき、ChatGPTに質問すると解決のヒントを得られることもあります。

ChatGPTが書くコードは、検証が必要です。

ChatGPTが各コードは、鵜呑みにすることが出来ないです。
そのまま使っても、そのまま使っても動かないことが時々あるからです。

私と同じような問題にはまっている人の役に立てるように、今回記事を書きました。
今回のコードは、既にGitHubで公開しています。
修正の目途が立ちましたので、出来るだけ早く修正を終えたいと思っています。

Discussion