※このページではアフィリエイト広告を利用しています

【Flask入門】エラーハンドリングとデバッグの基本

Python

Flaskを使ってWebアプリケーションを作っていると、さまざまな「エラー」に遭遇することがあります。たとえば「ページが見つからない(404)」「内部エラー(500)」といったエラーメッセージに戸惑った経験はありませんか?

この記事では、Flaskで発生するエラーの種類と、それらをどのように処理するか、そしてアプリ開発をスムーズに進めるための「デバッグの方法」について解説します。

この記事で学べること
  • Flaskにおけるエラーハンドリングの基本
  • tryexceptによるPythonらしいエラー処理
  • ユーザー向けエラーメッセージの表示方法
  • Flaskのデバッグモードの使い方
スポンサーリンク
スポンサーリンク

Flaskにおけるエラーハンドリングとは?

Webアプリケーションでは、予期せぬエラーが発生することは避けられません。たとえば、存在しないページにアクセスされたとき、ユーザーが不正な入力を送信したときなどです。

Flaskでは、以下のような方法でこうしたエラーに対応できます:

  • 標準のHTTPエラーコード(例:404 Not Found)
  • 独自のエラーページを作成
  • アプリケーションエラー(例:データベース接続失敗など)をキャッチして処理

Flaskの標準エラーハンドリング

Flaskは、いくつかのよく知られたHTTPエラー(404, 500など)を標準で処理しますが、それに加えて、独自のカスタムエラーページを作ることもできます。

例:404 Not Found(ページが見つからない)

from flask import Flask, render_template

app = Flask(__name__)

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

このように@app.errorhandler(404)デコレーターを使えば、ユーザーが存在しないページにアクセスした場合に、カスタムページ(例:404.html)を返すことができます。

例:500 Internal Server Error

@app.errorhandler(500)
def internal_error(e):
    return render_template('500.html'), 500

try-exceptを使ったエラートラップ(Python標準)

FlaskはPythonで作られているため、Pythonの標準構文であるtryexceptも活用可能です。

たとえば、計算やファイル操作、APIアクセスなどで起こる例外をキャッチしたい場合に有効です。

例:0除算の例外処理

@app.route('/divide')
def divide():
    try:
        result = 10 / 0
        return f"結果は {result}"
    except ZeroDivisionError:
        return "エラー:0で割ることはできません。"

このようにすることで、アプリがクラッシュせずに、ユーザーにわかりやすいメッセージを返せます。

ユーザーにエラーメッセージを表示する

フォーム入力でエラーがあったときなど、ユーザーに適切なエラーを表示したい場合は、テンプレートを使って伝えるのが一般的です。

例:バリデーションエラーの表示

@app.route('/submit', methods=['POST'])
def submit():
    name = request.form.get('name')
    if not name:
        error = "名前は必須項目です。"
        return render_template('form.html', error=error)
    return f"こんにちは、{name}さん!"

HTML側のテンプレート(form.html)

<form method="POST">
  <input type="text" name="name" placeholder="名前を入力">
  <input type="submit" value="送信">
</form>

{% if error %}
  <p style="color:red;">{{ error }}</p>
{% endif %}

Flaskのデバッグモードの活用

デバッグモードとは?

開発中のFlaskアプリでは、**デバッグモード(debug=True)**を有効にすることで、以下のような便利な機能が使えます:

  • エラー発生時に、詳細なトレースバックを表示
  • コードを変更するとアプリが自動的に再起動される(ホットリロード)

使い方

if __name__ == '__main__':
    app.run(debug=True)

実行すると、エラー時には以下のような「インタラクティブなデバッガー画面」が表示され、どこでエラーが起きたのかがすぐに分かります。

注意:本番環境(Production)ではdebug=Trueを使ってはいけません。セキュリティ上のリスクがあるためです。

よくあるエラーとその対処法

エラー内容原因対処法
404 Not Found存在しないURLへアクセスURLルーティングを見直す
500 Internal Server Errorサーバー内部のバグtry-exceptで例外を確認
KeyError存在しない辞書のキーを参照.get()を使うと安全
TypeError関数の引数の数が合わないなど関数定義と呼び出し元を確認

デバッグ用ログを出力する

コードにエラーがある箇所を探すには、ログ出力も有効です。Flaskでは標準のprint()関数やloggingモジュールを活用できます。

例:ログの基本

import logging

logging.basicConfig(level=logging.DEBUG)

@app.route('/')
def index():
    logging.debug("デバッグログ:index関数が呼ばれました")
    return "Hello Flask!"

エラーハンドリングのベストプラクティス

  • try-exceptを使うときは、なるべく具体的なエラー(例:ValueError)を指定する
  • 本番環境ではエラーメッセージをユーザーに直接表示しない
  • 必ずログに残すことで、後で原因を追跡できるようにする
  • 汎用のエラーページ(404、500)をテンプレートとして用意する

まとめ:エラーは学びのチャンス!

エラーが出ると戸惑うこともありますが、適切に対処すれば大きな問題にはなりません。Flaskのエラーハンドリング機能を活用して、より安定したアプリケーションを作れるようになりましょう!

タイトルとURLをコピーしました