ここでは「FlaskとPyhonを使ったエラーハンドリング」ということで、実際にエラーハンドリングの方法を紹介します。
この記事を読むことで
HTTPステータスコードとは何か
FlaskとPyhonでのエラーハンドリング
を学ぶことができます。
したがって
エラーハンドリングの仕組みについて理解したい
Webアプリケーションにエラーハンドリング機能を追加したい
という方に役立てて頂ければ幸いです。
それでは始めていきましょう!
HTTPステータスの種類と意味
Flaskでエラーハンドリング対策をする前に、HTTPステータス(正式にはHTTPレスポンスステータスコード)がどのようなものかを確認しておきましょう。
HTTPステータスと種類
HTTPレスポンスステータスコードとは
を表すコードを意味し、5つのクラスに分類されています。
ステータスコードの種類情報:(1xx)
成功:(2xx)
リダイレクション:(3xx)
クライアントエラー:(4xx)
サーバーエラー:(5xx)
このステータスコードの「404」は「ページが見つからない」ことを示す404エラーと呼ばれることが多く、皆さんもどこかで一度は見たことがあると思います。
実際にFlask:Pythonを使ってWebアプリを実行し、送受信のリクエストを行ってみると
のようにHTTPステータスコードが返されます。
正常にHTTPリクエストが行われると、リクエストの成功を示す「200」のステータスコードが返されていることが確認できます。
よく見るエラーコード
続いて、よく見るエラーコードを2つに厳選して確認していきます。
「404」エラー
先ほども少し説明した「404」エラーは
になります。
この「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ステータスコードを受け取ると、このように表示されます。
この404、500のHTTPステータスコードを受け取ったときに、Webページの表示をどう変化させるかを、FlaskとPythonを使ってエラーハンドリングしていきます。
※下記の記述はFlaskとPyhonを使用しており、テンプレート継承でページを作成しています。また、レイアウトはBootstrapを使用しています。
FlaskとPyhonのテンプレート継承等は当サイトの下記記事にて紹介しているので、こちらも合わせてご覧ください。
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
上記のように
と記述することで「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で実行してみると
無事、「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でアクセスすると
と表示され、「500」専用のエラーページが表示されていることがわかります。
このように、「@app.errorhandler()」を設定すれば各HTTPステータスコードに対応したページを作ることが可能なので、必要ならばぜひオリジナルのエラーハンドリングをしてみてはいかがでしょうか。
参考にしたサイト
Dr.Home Net COLUMN :403エラーや404エラーなど、主なエラーコードの意味・原因・対処法
お疲れ様でした。