Flask学習|デバッグモードの使い方とエラー対処法を学ぼう【チャプター6-05】

ながみえ

一つ前のページではapp.loggerによるログ出力について学習しました。

今回は デバッグモード について見ていきましょう。

Chapter1:Flask入門編
Chapter2:Jinja2入門編
Chapter3:フィルター編
Chapter4:フォーム編
Chapter5:データベース編
Chapter6:エラーハンドリングとデバッグ編

 ・Chapter6-1:Flaskでよくあるエラー集と対処法
 ・Chapter6-2:エラーハンドリングの基本
 ・Chapter6-3:カスタムエラーページを作ろう
 ・Chapter6-4:ログを出力してデバッグしよう
 ・Chapter6-5:デバッグモードを活用しよう ◁今回はここ
 ・Chapter6-6:Flask-DebugToolbarを使おう
Chapter7:アプリ開発編

Webアプリケーションを開発していると、予期しないエラーや動作不良に頻繁に遭遇します。

こうしたトラブルを解決するためには「デバッグ」が必要不可欠です。

Flaskには開発者が効率よくバグを発見し、修正するための「デバッグモード」が標準で搭載されています。

本記事では、Flaskのデバッグモードの活用方法について解説します。

初心者の方でも理解しやすいように、基本構文から実際のエラー表示、便利なインタラクティブデバッガの使い方まで順を追って説明します。

  • デバッグモードとは何か?
  • app.run(debug=True) の基本構文と効果
  • FLASK_ENVFLASK_DEBUGなどの環境変数について
  • エラー発生時に表示される「スタックトレース」の見方
  • Flaskに標準搭載されている「インタラクティブデバッガ」の操作方法

本記事は 有料記事(100円)ですが、現在は期間限定で無料公開中です。

<<前のページ

Flaskの記事一覧

次のページ>>

Flaskのデバッグモードとは?概要と特徴を解説

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

デバッグモード とは、Flaskが開発者向けに用意している特別な実行モードです。

このモードを有効にすると、アプリケーション内でエラーが発生した際に、詳細なエラー情報(スタックトレース)を自動的に表示し、原因箇所を特定しやすくなります。

さらに、デバッグモードでは以下のような開発支援機能が提供されます:

  • コード変更の自動再読み込み(ホットリロード)
  • エラー発生時のスタックトレースの表示
  • ブラウザ上でのインタラクティブなデバッガ画面

これらの機能は、開発中のアプリケーションにおいて、バグの早期発見・迅速な修正を大きく助けてくれます。

ただし、本番環境(リリース後のWebサービス)では、情報漏洩のリスクがあるため、デバッグモードは絶対に使用しないように注意が必要です。

デバッグモードを起動する方法とコード例

Flaskでデバッグモードを有効にする方法はいくつかありますが、最も基本的なのは app.run(debug=True) を使う方法です。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, Flask!"

if __name__ == '__main__':
    app.run(debug=True)  # デバッグモードをONにする

このように debug=True を指定することで、Flaskは開発者向けの補助機能(自動再読み込み、詳細なエラーページなど)を有効にします。

【Python】勉強猫がノートパソコンを見ながら考え込む様子。記事内の休憩用イラスト

スタックトレースとは?読み方と実例で理解しよう

デバッグモードが有効な状態でエラーが発生すると、ブラウザには スタックトレース(Stack Trace)と呼ばれるエラーの詳細が表示されます。

スタックトレースとは、エラーが発生した際に、「どのファイルのどの行で、どの関数が呼び出されていたのか」を順に示したリストです。

これを見ることで、「なぜそのエラーが起きたのか」「どこでバグが発生しているのか」が分かります。

例:ゼロ除算エラー時のスタックトレース表示

以下のコードは、0で割り算をしようとしてエラーを発生させます。

@app.route('/error')
def cause_error():
    return 10 / 0  # ゼロ除算エラー

この状態で /error にアクセスすると、以下のようなトレースバックがブラウザに表示されます(一部抜粋):

Traceback (most recent call last):
  File "...\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "...\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "...\app.py", line 10, in cause_error
    return 10 / 0
ZeroDivisionError: division by zero

スタックトレースの確認ポイントと注意点

  • 下から上に読むとエラーの流れが分かりやすいです。
  • 最下行の ZeroDivisionError: division by zero がエラーの種類と原因です。
  • app.pyline 10 がバグの発生場所です。
  • それ以前の行は関数の呼び出し履歴(コールスタック)を示しています。

この情報をもとに、どの行を修正すべきか、また何が原因だったのかを素早く特定できます。

インタラクティブデバッガの使い方と注意点

Flaskのデバッグモードを有効にすると、インタラクティブデバッガ(Interactive Debugger)が使えるようになります。

これはエラー発生時に表示されるブラウザ上のエラーページから、その場でPythonのコードを実行してアプリの状態を調査できる強力な機能です。

表示条件:インタラクティブデバッガが出る場面

たとえば、次のようなコードで /error にアクセスしたとき:

@app.route('/error')
def error():
    x = 10
    y = 0
    return x / y  # ここでZeroDivisionErrorが発生

アクセスすると、エラーページの下部に「Console」というボタンが表示されます。

このボタンを押すと、以下のようなPythonの対話型コンソールがブラウザ上に現れ、変数の中身を確認したり、一時的なコードをその場で実行することができます。

実践例:対話型デバッガで変数を確認する方法

>>> x
10
>>> y
0
>>> x + 5
15

このようにして、コード内の変数の状態や、関数の戻り値などを直接確認できるため、バグの原因をより迅速に特定することが可能です。

本番環境での使用が危険な理由とその対策

このインタラクティブデバッガは非常に便利ですが、本番環境で絶対に有効にしてはいけません。

なぜなら、悪意のある第三者にコードの内部構造を知られてしまう危険があるためです。

Flaskは「デバッグモードが有効なとき、外部からのアクセスに対してもデバッガを表示する」設定がデフォルトなので、ローカル環境でのみ使用するようにしましょう。

まとめ|Flaskのデバッグモードで効率的に開発しよう

今回はFlaskのデバッグモードについて学びました。

開発中に発生するバグやエラーに対し、どのように向き合い、どのように素早く原因を特定するかが理解できたはずです。

デバッグスキルはアプリ開発の中で極めて重要な要素です。トライ&エラーを繰り返す中で少しずつ感覚を掴んでいきましょう。

次回はさらに強力なデバッグ支援ツール「Flask-DebugToolbar」の活用方法について学びます。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいFlask学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

Flaskの記事一覧

次のページ>>

FAQ|Flaskのデバッグモードとトラブル対応

Q
Q1. デバッグモードはどんなときに使うべきですか?

アプリ開発中にエラーの原因を素早く特定したいときに使います。エラーの詳細情報やスタックトレースが自動表示されるため、初心者でも問題箇所を把握しやすくなります。

Q
Q2. デバッグモードの状態かどうかを確認する方法はありますか?

Flaskアプリを起動した際のターミナルログに「Debug mode: on」と表示されれば、デバッグモードが有効になっています。また、ブラウザ上にエラー詳細が表示されるかも確認ポイントです。

Q
Q3. デバッグモードでのインタラクティブデバッガが表示されない場合はどうすればいいですか?

debug=Trueが正しく指定されているか、セキュリティ設定で外部アクセスがブロックされていないかを確認してください。環境によっては、FLASK_DEBUG=1の設定も必要になります。

記事URLをコピーしました