注目キーワード
  1. Photoshop
  2. Python
  3. Raspberry Pi
  4. Arduino

FlaskとPythonでエラーハンドリングをする方法

  • 2020年12月10日
  • 2020年12月10日
  • Python

ここでは「FlaskとPyhonを使ったエラーハンドリング」ということで、実際にエラーハンドリングの方法を紹介します。
この記事を読むことで

HTTPステータスコードとは何か

FlaskとPyhonでのエラーハンドリング

を学ぶことができます。

 

したがって

エラーハンドリングの仕組みについて理解したい

Webアプリケーションにエラーハンドリング機能を追加したい

という方に役立てて頂ければ幸いです。

 

それでは始めていきましょう!

 

HTTPステータスの種類と意味

Flaskでエラーハンドリング対策をする前に、HTTPステータス(正式にはHTTPレスポンスステータスコード)がどのようなものかを確認しておきましょう。

 

HTTPステータスと種類

HTTPレスポンスステータスコードとは

HTTPリクエスト(Webページを見る人とWebサーバー側のやりとり)が正しく行われているか

を表すコードを意味し、5つのクラスに分類されています。

 

ステータスコードの種類情報:(1xx)

成功:(2xx)

リダイレクション:(3xx)

クライアントエラー:(4xx)

サーバーエラー:(5xx)

 

このステータスコードの「404」は「ページが見つからない」ことを示す404エラーと呼ばれることが多く、皆さんもどこかで一度は見たことがあると思います。

 

実際にFlask:Pythonを使ってWebアプリを実行し、送受信のリクエストを行ってみると

flask-errorcode-01

のようにHTTPステータスコードが返されます。

正常にHTTPリクエストが行われると、リクエストの成功を示す「200」のステータスコードが返されていることが確認できます。

 

よく見るエラーコード

続いて、よく見るエラーコードを2つに厳選して確認していきます。

 

「404」エラー

先ほども少し説明した「404」エラーは

指定したURLが存在しない場合に返却されるHTTPステータスコード

になります。

 

この「404」エラーはネットサーフィンをしている方なら見たことがあると思いますが、実は各サイトによってオリジナルの「404」エラーページを用意していることが多いです。

 

これは、ユーザーのページ離脱率を下げる狙いがありSEOの観点からもオリジナルページを用意しておくことは必須と言えます。

従って、「404」エラーページのレイアウトが可能ならば、是非オリジナル制のあるページを作成するべきです。

 

404エラーページ参考例をまとめてある下記サイトに目を通しておくと、各サイトごとにどれほどエラーページが違うのかを知ることもできますよ。

 

PLAN-B:404not found(404エラー)とは?

 

「500」エラー

「500」エラーは聞く機会が少ないと思いますが、これは

サーバー側で問題が起きた時に生じるエラー

と認識してください。

 

WordPressなどをご利用の方は見たことがあると思いますが、「.htaccess(htアクセス)ファイル」や「PHPファイル」のプログラムに問題がある場合に発生することがあります。

要するに、サイト管理者側のプログラムがおかしいぞ!ということですね。

 

プログラムの原因で発生するコードですので、メンテナンスには時間がかかることがあり、原因箇所を探すのにも苦労すると思うのでバックアップを取っておくと対策・対応をスムーズに行うことができますね。

 

ではエラーハンドリングに進む前にお知らせです。

PythonとFlaskを使ってWebアプリケーション開発を学びたい方は「Udemy」のこちらのコースがオススメです。

Webデザイン、アプリの開発やPythonのスキルアップを目指したい方は是非上記リンクからのぞいてみてください。

 

FlaskとPythonを使ったエラーハンドリング

実際にコマンドプロンプト、ターミナルでHTTPステータスコードを受け取ると、このように表示されます。

flask-errorcode-04

 

この404、500のHTTPステータスコードを受け取ったときに、Webページの表示をどう変化させるかを、FlaskとPythonを使ってエラーハンドリングしていきます。

 

※下記の記述はFlaskとPyhonを使用しており、テンプレート継承でページを作成しています。また、レイアウトはBootstrapを使用しています。

FlaskとPyhonのテンプレート継承等は当サイトの下記記事にて紹介しているので、こちらも合わせてご覧ください。

Flask入門編02 Pythonを使って簡単なログインWebアプリを作成する

 

Flask、Pythonの404エラーハンドリング

まずは404エラーハンドリング処理になります。

 

Pythonファイル「app.py」に以下の記述を追加しましょう。

app.py

@app.errorhandler(404)
def page_not_found(error):
    return render_template('not_found.html', \
        title='The requested URL was Not found', \
        message='アクセスしていただいたURLが見つかりません。'),404

 

上記のように

@app.errorhandler(404)

と記述することで「404」のHTTPリクエストが発生した時に、@app下の関数を実行させることができます。

今回は、render_template()で別途用意したHTMLファイルを読み込んでいます。

 

また、「 , 404 」はrender_template()の処理が終わったらHTTPステータスコードの「404」を返す記述です。

この部分に「404」と記述することで、コマンドプロンプトやターミナルで返される数字を「404」に変えることができます。

 

HTML側は、事前に作成したレイアウトからテンプレート継承を行ってファイルを作成します。

not_found.html

<!-- layout.htmlを継承してWebページを作成 -->
{% extends "layout.html" %}

{% block title %}
{{title}}
{% endblock %}

{% block headline %}
<img src="{{ url_for('static',filename='sorry.png') }}" width="100" style="float:right">
{{ title }}
{% endblock %}

{% block content %}
<p>{{ message }}</p>
{% endblock %}

 

単に「404」エラーページを作成するだけではつまらないと思うので、イラスト屋の画像をお借りしてイメージ画像を挿入してみました。

 

「python app.py」とコマンドプロンプト、ターミナルに記述し、作成したWebアプリに対して存在しないURLで実行してみると

flask-errorcode-02

無事、「URL was Not found」の404ページを表示させることができました。

 

Flask、Pythonの500エラーハンドリング

続いて、「500」エラーページを作成します。

「500」はプログラムのシステムエラー等で起こるので、今回は「ユーザー登録者かどうか」を判別してエラーハンドリングを行っていきます。

 

まずはPythonファイル「app.py」に以下の記述を追加しましょう。

app.py

@app.route('/user/<string:user_name>')
def user(user_name):
        if user_name in ['Flask', 'Python']:
            return render_template('index.html',\
                title = 'ユーザーページ', \
                message='{}さん、こんにちは!'.format(user_name))
        else:
            abort(500)

@app.errorhandler(500)
def system_error(error):    # error.descriptionでエラー時の文字列取得
    return render_template('system_error.html', \
        title='500 System Error', \
        message='入力されたユーザーは登録されていません。'),500

 

予めユーザーのリストを「Flask、Python」と用意しておき、指定したユーザー名を含むアドレスでアクセスした場合にはユーザーごとのページを表示します。

一方、ユーザーのリストにないユーザー名でアクセスした場合には「abort(500)」として「500」エラーを返すようにしています。

 

@app.errorhandler(500)下は先ほどの「404」エラーハンドリングと同じ動きになります。

「500」エラーでは別途「system_error.html」ファイルを読み込んでいます。

 

「500」エラーが起こるURLでアクセスすると

flask-errorcode-03

と表示され、「500」専用のエラーページが表示されていることがわかります。

 

このように、「@app.errorhandler()」を設定すれば各HTTPステータスコードに対応したページを作ることが可能なので、必要ならばぜひオリジナルのエラーハンドリングをしてみてはいかがでしょうか。

 

参考にしたサイト

Dr.Home Net COLUMN :403エラーや404エラーなど、主なエラーコードの意味・原因・対処法

 

Qiita:flaskでhttpステータスを返却する方法

 

 

お疲れ様でした。

flask-errorcode-thubnail
学びに関する情報をチェック!