カスタムエラーページ—Flaskドキュメント

提供:Dev Guides
< FlaskFlask/docs/1.0.x/patterns/errorpages
移動先:案内検索

カスタムエラーページ

Flaskには、HTTPエラーコードを使用してリクエストを早期に中止する便利なabort()関数が付属しています。 また、基本的な説明が記載されたわかりやすい白黒のエラーページも表示されますが、特別なことは何もありません。

エラーコードに応じて、ユーザーが実際にそのようなエラーを目にする可能性は低くなります。

一般的なエラーコード

次のエラーコードは、アプリケーションが正しく動作している場合でも、ユーザーに表示されることが多いものです。

404お探しのページが見つかりませんでした
古き良き「チャップ、あなたはそのURLを入力するのを間違えました」というメッセージ。 インターネットの初心者でさえ、404が意味することを知っているほど一般的です:くそー、私が探していたものはそこにありません。 少なくともインデックスへのリンクなど、404ページに実際に役立つものがあることを確認することをお勧めします。
403禁止します
Webサイトに何らかのアクセス制御がある場合は、許可されていないリソースの403コードを送信する必要があります。 したがって、ユーザーが禁止されたリソースにアクセスしようとしたときに、ユーザーが失われないようにしてください。
410ゴーン
「404NotFound」に「410Gone」という名前の兄弟がいることをご存知ですか? 実際にそれを実装する人はほとんどいませんが、以前に存在して削除されたリソースは、404ではなく410で答えるという考えです。 データベースからドキュメントを完全に削除するのではなく、単に削除済みとしてマークする場合は、ユーザーに好意を示し、代わりに410コードを使用して、探していたものが永久に削除されたことを示すメッセージを表示します。
500内部サーバーエラー
通常、プログラミングエラーが発生した場合、またはサーバーが過負荷の場合に発生します。 アプリケーションは遅かれ早かれ失敗するので、そこに素敵なページを用意するのは非常に良い考えです(アプリケーションエラーも参照)。


エラーハンドラ

エラーハンドラーは、エラーのタイプが発生したときに応答を返す関数です。これは、ビューが要求URLが一致したときに応答を返す関数であるのと同様です。 処理中のエラーのインスタンスが渡されます。これはおそらくHTTPExceptionです。 「500InternalServer Error」のエラーハンドラーには、明示的な500エラーに加えて、キャッチされない例外が渡されます。

エラーハンドラは、errorhandler()デコレータまたはregister_error_handler()メソッドに登録されます。 ハンドラーは、404などのステータスコードまたは例外クラスに登録できます。

応答のステータスコードはハンドラーのコードに設定されません。 ハンドラーから応答を返すときは、必ず適切なHTTPステータスコードを指定してください。

デバッグモードで実行している場合、「500 InternalServerError」のハンドラーは使用されません。 代わりに、対話型デバッガーが表示されます。

「404ページが見つかりません」例外の実装例を次に示します。

from flask import render_template

@app.errorhandler(404)
def page_not_found(e):
    # note that we set the 404 status explicitly
    return render_template('404.html'), 404

アプリケーションファクトリパターンを使用する場合:

from flask import Flask, render_template

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

def create_app(config_filename):
    app = Flask(__name__)
    app.register_error_handler(404, page_not_found)
    return app

テンプレートの例は次のとおりです。

{% extends "layout.html" %}
{% block title %}Page Not Found{% endblock %}
{% block body %}
  <h1>Page Not Found</h1>
  <p>What you were looking for is just not there.
  <p><a href="{{ url_for('index') }}">go somewhere nice</a>
{% endblock %}

APIエラーをJSONとして返す

Web APIにFlaskを使用する場合、上記と同じ手法を使用して、APIエラーにJSON応答を返すことができます。 abort()は、descriptionパラメーターで呼び出されます。 errorhandler()はそれをJSONエラーメッセージとして使用し、ステータスコードを404に設定します。

from flask import abort, jsonify

@app.errorhandler(404)
def resource_not_found(e):
    return jsonify(error=str(e)), 404

@app.route("/cheese")
def get_one_cheese():
    resource = get_resource()

    if resource is None:
        abort(404, description="Resource not found")

    return jsonify(resource)