質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Flask

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

Q&A

解決済

2回答

1676閲覧

Flaskのメソッドで return redirect をすると新規画面がどんどん増えてしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

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

0グッド

0クリップ

投稿2022/06/30 04:54

Flaskで以下のようなプログラムを組んでいます。

python

1import threading,webbrowser 2from flask import Flask, render_template, redirect, request 3from ext_py.dbshow import DB_show 4 5app = Flask(__name__) 6 7@app.route('/') 8def menu(): 9 return render_template('myapp/home.html', title='FLASK Menu') 10 11@app.route('/alldata') 12def alldata(): 13 dbs = DB_show() 14 dbinfos = dbs.selectall() 15 return render_template('myapp/alldata.html', title='alldata', alldata=dbinfos) 16 17@app.route('/browse/<string:pk>') 18def browse( pk ): 19 .... 20 何らかの処理 21 .... 22 return redirect('/alldata') 23 24if __name__ == "__main__": 25 threading.Timer(1.0, lambda: webbrowser.open('http://localhost:5000') ).start() 26 app.run(debug=False)

データベースからデータを読み込んで、alldata.htmlでテーブルに表示して、どれかの行をクリックすると pk が browse に送られて処理したあとに、もう一度 alldata に戻ると webページがどんどん追加されてしまいます。

新規画面がどんどん増えないようにしたいのですが、どうしたらいいのでしょうか?

もっと具体的に言うと、

  1. Flask のメソッドは必ず return を必要とするものなのでしょうか?
  2. 処理を済ませた後で前の画面に戻るということはできるのでしょうか?

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

FiroProchainezoさん、おかげさまで解決いたしました。

実はFlask の問題ではなくて、javascript に問題がありました。
おっしゃるようにデータ抽出一覧表をクリックして pk を渡すのですが、以下のように書いていました。

javascript

1<script type="text/javascript"> 2$(function(){ 3 $('td').click(function() { 4 var pk = $(this).closest('tr').children('td').eq(0).text(); 5 open( "/browse/" + pk ) ; 6 }); 7}); 8</script>

最初は、新しいウィンドウで閲覧する予定で、target = '_blanc'みたいにしていのですが、それを途中で変更したのでした。でも open ってそれ自体で新しいウインドウが開くことは知りませんでした。

以下のように書き換えたら、思うように動くようになりました。

javascript

1<script type="text/javascript"> 2$(function(){ 3 $('td').click(function() { 4 var pk = $(this).closest('tr').children('td').eq(0).text(); 5 window.open( "/browse/" + pk, '_self' ) ; 6 }); 7}); 8</script>

Flaskではないのに御迷惑をおかけしました。

御回答の文脈から、エラーの原因はFlaskではないと思い、プログラムを点検し直したおかげで解決できました。
大変助かりました。
ありがとうございました。

投稿2022/06/30 06:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

  1. Flask のメソッドは必ず return を必要とするものなのでしょうか?

はい、必須です。

  1. 処理を済ませた後で前の画面に戻るということはできるのでしょうか?

特定のページにリダイレクトするためにredirect()を使用します。

/alldataでたぶん一覧が見えて、一覧にあるリンクか何かをクリックすると、
/browse/<string:pk>にPKが渡され、それに対応した処理が行われ、最終的にredirectするのだと思いますが、
/alldataを表示しなおすとWebページがどんどん追加される」というのが理解できません。

「Webページが追加される」とはどういうことでしょうか?
「なんらかの処理」にDB処理が含まれている場合、ここのUpdateやInsertがページを追加しているということはないですか?

詳細な回答が欲しい場合は、現象が再現する最小のコードの提供をお願いします。
kirakuniさんの頭の中だけにあり、説明されていない部分が関わっている可能性が高いです。

投稿2022/06/30 05:44

FiroProchainezo

総合スコア2401

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

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

退会済みユーザー

退会済みユーザー

2022/06/30 06:11

ご回答ありがとうございます。 何らかの処理の中には確かに以下のようにデータベース操作が入っています。 @app.route('/browse/<string:pk>') def browse( pk ): dbs = DB_show() imgArr = dbs.selectDfile( pk ) dbs.dcmdn( imgArr ) dbs.show() return redirect('/alldata' ) ただ、これを @app.route('/browse/<string:pk>') def browse( pk ): print(pk) return redirect('/alldata' ) としても動作が同じなのであえて書きませんでした。 「Webページが追加される」という表現は、どのように表現したらいいのかがわからなかったのでこう書いたのですが、firefox で新しいタブを追加するような感じでどんどんタブが増えるという意味でした。
退会済みユーザー

退会済みユーザー

2022/06/30 06:22

補足させていただきます。 def alldata()を以下のようにすると、新しいタブは追加されないようです。 @app.route('/alldata') def alldata(): return render_template('myapp/alldata.html', title='alldata') つまり、def alldata():でデータ抽出をおこなって、その結果をテンプレートに貼り付ける行為をすると、新しいタブがどんどん増えるようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問