Back to Blog

Flaskでのエラーハンドリングの方法を解説!

flask

2024年7月12日

こんにちは!

今回の記事では、Flaskによるエラーハンドリングの方法を解説します。

Webアプリケーション開発において、エラーハンドリングは非常に重要な役割を果たします。

特に、Flaskのような軽量なPythonのWebフレームワークを使用する際には、適切なエラーハンドリングを実装することで、UXの向上や、開発・デバッグプロセスの効率化を図ることができます。

本記事では、Flaskにおけるエラーハンドリングの基本から高度なテクニックまでを、具体的なコード例とともに詳しく解説します。

Flaskの基本的なエラーハンドリング

エラーハンドリングとは、プログラムがエラーを起こした時に、すぐに実行を終了せずに、あらかじめ用意しておいた処理を行うことです。

具体的には、存在しないページへアクセスした際に、404のエラーページを表示さたり、サーバー側でエラーが発生した際に、適切な処理を行うことです。

404エラーハンドリングの実装

一番よくあるのが404エラーハンドリングです。

404エラーとは、存在しないページにアクセスした際にサーバーが返すステータスコードです。一般的には、404エラーの場合は、「ページが存在しません」と書かれた404エラーページを返します。

では、Flaskで404エラーページを実装してみましょう。app.pyに以下のように設定します。

from flask import Flask, render_template

app = Flask(__name__)

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

@app.route('/')
def home():
    return "Hello, World!"

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

このコードでは、@app.errorhandler(404)デコレーターを使用して、404エラーが発生した際にpage_not_found関数が呼び出されるようにしています。

この関数は、404.htmlテンプレートをレンダリングし、HTTPステータスコード404を返します。

404エラーページの作成

続いて、404エラーページの作成をおこないます。

templatesディレクトリの404.htmlファイルに記述します。

<!-- templates/404.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>404 - ページが存在しません</title>
</head>
<body>
    <h1>404 - ページが存在しません</h1>
    <p>すみません、閲覧しようとしたページは存在しません</p>
    <a href="#">ホームへ戻る</a>
</body>
</html>

ページの作成が完了したら、Flaskを起動させてみましょう。

python app.py

http://127.0.0.1:5000/以外のURL(/hogeなど)にアクセスすると、以下のような404ページが表示されます。

エラーハンドラーの使い方

今回、エラーハンドルをするために、@app.errorhandlerデコレーターを使いました。

@app.errorhandlerデコレーターは、任意のHTTPステータスコードを引数に取ることができます。

500エラーの場合

例えば、500エラー(内部サーバーエラー)をハンドリングする場合は、以下のようにします。

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

なにかFlaskアプリケーションでエラーが発生した場合は、500.htmlのページが表示されるようになります。

(参考)HTTPステータスコードとは?

ここまで、404エラーや500エラーのページを作成しました。

そもそもHTTPステータスコードとはなんなのでしょうか?エラーハンドルをする上で重要なことなので、簡単に解説します。

HTTPステータスコードとは、Webサーバーがクライアントからのリクエストに対して返すレスポンスの一部として送信されます。

これらのコードは、リクエストの結果を示し、リクエストが成功したか、エラーが発生したか、またはリクエストのさらなる処理が必要かどうかを示します。主なステータスコードは以下の通りです。

ステータスコード意味説明
200OKリクエストが成功し、正常に処理されました。
301Moved Permanentlyリソースが恒久的に移動されました。
400Bad Requestリクエストが不正です。
401Unauthorized認証が必要です。
403Forbiddenリクエストは許可されていません。
404Not Foundリソースが見つかりません。
500Internal Server Errorサーバー内部のエラーです。
503Service Unavailableサービス利用不可です。

エラーや不具合の場合は、4xxや5xxのステータスコードを返します。多くの種類があるので、主なものだけでも覚えておきましょう。

カスタム例外

Flaskでは、カスタム例外を定義して、それに対応するエラーハンドラーを設定することができます。

これにより、アプリケーション固有のエラー処理を柔軟に行うことができます。

カスタム例外の実装

ここからは、カスタム例外を実装していきます。

Pythonの標準的な例外クラスを継承してカスタム例外を定義します。

例えば、CustomErrorという名前のカスタム例外を作成します。app.pyに以下を追加します。

class CustomError(Exception):
    pass

特定の条件でこのカスタム例外を発生させます。

以下の例では、/cause_custom_error エンドポイントにアクセスすると CustomErrorが発生します。raise文を使うことで、明示的に例外を発生させることができます。

@app.route('/cause_custom_error')
def cause_custom_error():
    raise CustomError("This is a custom error message.")

次に、flaskの @app.errorhandler デコレーターを使用して、カスタム例外のハンドラーを定義します。

このハンドラーは、カスタム例外が発生した際に特定の処理を行います。

@app.errorhandler(CustomError)
def handle_custom_error(e):
    return f"Custom Error Occurred: {str(e)}", 500

app.pyの中身

上記のように設定すると、app.pyは以下のようになります。

from flask import Flask, render_template

app = Flask(__name__)

# カスタム例外の定義
class CustomError(Exception):
    pass

# カスタム例外を発生させるエンドポイント
@app.route('/cause_custom_error')
def cause_custom_error():
    raise CustomError("This is a custom error message.")

# カスタム例外のハンドラー
@app.errorhandler(CustomError)
def handle_custom_error(e):
    return render_template('custom_error.html', message=str(e)), 500

# 基本的なエンドポイント
@app.route('/')
def home():
    return 'Home Page'

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

このように実装することで、カスタム例外を設定することができます。

まとめ

今回の記事では、Flaskによるエラーハンドリングについて解説しました。

エラーハンドリングは、アプリケーションの信頼性とユーザーエクスペリエンスを向上させるために不可欠な要素です。

本記事で紹介した基本的なエラーハンドリングの実装方法から、カスタムエラーページの作成を参考に、効果的なエラーハンドリングを実現しましょう。

これにより、より堅牢で使いやすいWebアプリケーションを開発することができます。本記事が何かのお役に立てれば幸いです。

ここまでお読みいただきありがとうございました。

Webの知識を作りながら学ぶ
Flask WebAcademy

SNSアプリやチャットアプリ、さまざまなアプリを作りながら学べる実践的なカリキュラム

詳細を見る