✅ 結論:Flask初心者でも、録音再生&削除エラーは解決できる!
Flaskで構築した音声診断アプリで「録音したファイルが再生されない」「削除できない」「404エラーが出る」といった問題に直面しましたが、コードの見直しとルーティングの確認により、無事解決できました。
🧠 if __name__ == ‘__main__’: の存在に気づかず苦戦した話
実は最初、app.py
の末尾にこの記述が必要だと知らず、書かずに開発を進めていました。
# Flaskアプリの起動に必要な記述
if __name__ == '__main__':
app.run()
FlaskはWSGIサーバ(PythonAnywhereなど)で動かす場合、この行がなくても動くように見えることがあります。
ですが、ローカル開発環境やデバッグの際にはこれがないと アプリが起動しない ため、原因が特定しづらくなります。
「Flaskはルーティングを作ればすぐ動く」と思いがちですが、アプリを起動するコード自体も必要だと気づいた瞬間、コード全体の構造が見えるようになりました。
ちなみに、このコードは「このファイルを直接実行したときだけ実行される」条件付きの処理です。モジュールとしてインポートされると実行されません。
🚫 404エラーの原因と解決:ファイルパスの勘違い
録音したファイルを再生しようとしても404エラー。
原因は、url_for('static', filename='uploads/' + audio.filename)
の記述と、audio.filename
に student/
が含まれていたことの不整合でした。
正しい静的ファイルパスの構成を再確認し、テンプレート側のURL生成を修正することで、再生に成功。
<source src="{{ url_for('static', filename=audio.filename) }}">
🧹 録音削除できない?→ force_delete_audioで対応!
録音済みのファイルが物理的に存在しない場合、通常の削除ルートではエラーが発生します。
そんなときは、DB上のデータのみを削除する専用ルートを設けましょう。
@app.route('/force_delete_audio/<filename>', methods=['POST'])
@login_required
def force_delete_audio(filename):
audio = Audio.query.filter_by(filename=filename, user_id=current_user.id).first()
if audio:
db.session.delete(audio)
db.session.commit()
flash('データベースから録音情報を削除しました。')
else:
flash('対象のデータが見つかりませんでした。')
return redirect(url_for('list_audio'))
💡 本質は「コードの一貫性」+「DBとファイルの同期」
見た目上ファイルが「あるように見えて」実際には存在しないケースがあるので、
コード内のロジックがファイルの実体と一致していることを確認しましょう。
📌 補足:Flaskテンプレートのナビゲーション表示制御
講師専用の「👩🏫 講師ページ」リンクが、生徒にも見えてしまうという悩みも解決しました。
base.html
のナビゲーションで {% if current_user.role == 'teacher' %}
の条件を使い、ログインユーザーの役割に応じてメニューを制御することで、適切な表示が実現できます。
🎓 FlaskやPythonをしっかり学びたい方へ:
TechAcademyのPythonコース や、
Schooのライブ授業 もおすすめです。
実務にも強くなれる内容が揃っています。