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

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

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

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

Python

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

Q&A

1回答

1725閲覧

FlaskでRedirect(url_for('index')) の呼び出しが正常に動作しない

akeyi

総合スコア0

Flask

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

Python

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

1グッド

0クリップ

投稿2020/07/21 14:14

前提・実現したいこと

Flaskで音楽ファイルを再生するシステムを作っています。
音楽再生開始後にPLAYボタンを無効にし、
再生完了後にPLAYボタンを有効にする機能を実装中に
以下の問題が発生しました。

目的は、「再生完了時にPLAYボタンが再び有効にしたい。」

発生している問題・再生完了のcallbackメッセージまで問題ないですが、

下記の該当ソースでredirect部分が正常に動作しません。(呼び出されない)

^C(venv) pi@raspberrypi:~/hello_flask/sound $ python fl_play_all_format.py * Serving Flask app "fl_play_all_format" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 237-014-604 [2020-07-21 22:34:22,521] INFO in fl_play_all_format: 1 192.168.0.108 - - [21/Jul/2020 22:34:22] "GET /1 HTTP/1.1" 200 - 192.168.0.108 - - [21/Jul/2020 22:34:28] "POST /showfile HTTP/1.1" 200 - Finish [2020-07-21 22:34:44,024] INFO in fl_play_all_format: callback

該当のソースコード

Python

1ソースコード 2def wrap_play(filename): 3 snd = mpxplayer(filename) 4 re = snd.run() 5 app.logger.info("callback") 6 return redirect(url_for("index", val=1), code=307) #ここが正常に動作しない 7

試したこと(Pythonソース全体)

from flask import Flask, render_template, request, redirect, url_for from MPXPLAYER import mpxplayer from multiprocessing import Process import glob app = Flask(__name__) def getmusicInfo(): list = {} cnt = 0 for file in glob.glob("/mnt/samba/*.mp*"): list[cnt] = file cnt = cnt + 1 return list @app.route("/<val>") def index(val): app.logger.info(val) val = int(val) return render_template("mpindex.html", flag = val, selectedval = 0, musiclink=getmusicInfo()) def wrap_play(filename): snd = mpxplayer(filename) re = snd.run() app.logger.info("callback") return redirect(url_for("index", val=1), code=307) @app.route("/showfile", methods=['GET','POST']) def main(): wavFile= 0 global play if request.method == 'POST': if request.form['bt'] =='PLAY': wavFile = str(request.form["musicfile"]) musicFile = getmusicInfo()[int(wavFile)] play = Process(name="play", target=wrap_play, args=(musicFile, )) play.start() return render_template("mpindex.html", flag = 0, selectedval = int(wavFile), musiclink=getmusicInfo()) if __name__ == "__main__": app.run(debug=True, host='0.0.0.0')

補足情報(HTMLソース)

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> 8 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script> 9 </head> 10 <body> 11 <div class="container"> 12 <div class="header"> 13 <h3 class="text-muted">Music Page</h3> 14 <form action = '/showfile' method='POST'> 15 <select name="musicfile" style="font-size:16px;" id="listbox"> 16 {% for key, value in musiclink.items() %} 17 {% if selectedval == key %} 18 <option value = "{{key}}" selected>{{value}}</option> 19 {% else %} 20 <option value = "{{key}}" > {{value}}</option> 21 {% endif %} 22 {% endfor %} 23 </select> 24 {% if flag == 1 %} 25 <input type="submit" name="bt" value="PLAY" id="bt1"></input> 26 {% else %} 27 <input type="submit" name="bt" value="PLAY" id="bt1" disabled></input> 28 {% endif %} 29 </form> 30<script type="text/javascript" language="javascript"> 31 var select = document.getElementById( 'listbox' ); 32 select.onchange = function(){ 33 document.getElementById("bt1").disabled = false; 34 } 35</sciprt> 36 </div> 37 </div> 38 </body> 39</html>
FiroProchainezo👍を押しています

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

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

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

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

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

guest

回答1

0

動かせないので推測ですが、main()の処理はreturn render_template()で終了しているように見えます。
その後、wrap_play()でredirectされても、HTTP通信は終わっているはずなので、送り先がないのではないでしょうか。

なので、wrap_play()でredirectを呼ぶのではなく、フロント側でwrap_play()を呼ぶようなajax処理を実装するか、<val>の切り替え処理をセッション(クッキー)に保持させてそちらを確認するようにするかしてはいかがでしょうか。

投稿2020/07/27 01:15

FiroProchainezo

総合スコア2424

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問