FlaskでWebアプリ開発、リダイレクトとエラー

HTTPのエラーコードを久しぶりにちゃんと確認しましたよ。

普段なんとなくの知識を再確認するいいチャンスです。

今回は、flaskのチュートリアル、クイックスタートの「Redirect and Error」から勉強を進めていきます。動作させて動きをみる、を中心に行なっていきます。

チュートリアルページはこちらです。

こんな人の役に立つかも

・flaskを勉強している人

・PythonでWebアプリケーションを作りたい人

・flaskのクイックスタートチュートリアルで勉強をしている人

目次

Redirect and Error

チュートリアルプログラムを少し変更して、動作させてみていたいと思います。動作準備は、次のページも参考にしてください。

ぱんだクリップ
【Flask】Webアプリケーション開発の準備、Python仮想環境とデバッグ用Webサーバー | ぱんだクリップ パソコンを立ち上げて、flaskの開発を行う前に行う準備をまとめたページとなります。 flaskの開発環境はインストールされていることが前提となっています。インストール等...

「application.py」として次のプログラムを実行しました。

from flask import Flask, url_for, g
from markupsafe import escape
from flask import request
from flask import render_template
from flask import request, after_this_request
from flask import make_response
#追加したimport
from flask import abort, redirect
app = Flask(__name__)

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login')
def login():
    abort(401)
    #以下は実行されない
    this_is_never_executed()

importは前回までの流用+今回利用する「redirect」と「abort」を追加しています。「redirect」はその名前の通り、指定したURLへ遷移させます。「abort」は処理を中断します。abortの引数401は、HTTPのステータスコードです。401エラーで「Unauthorized」のエラーコードとなります。

あわせて読みたい

このプログラムを動作させ、適当なブラウザにて「localhost:5000」にアクセスすると、次のような画面が表示されました。

エラーハンドラ

クイックスタートの範囲から外れるのですが、「エラーハンドラ」を定義することで、オリジナルのエラー画面が実装できるそうです。

エラーハンドラを試すために、「application.py」の「@app.route(‘/login’)」を次のように変更します。(abortを400に変更)

@app.route('/login')
def login():
    #400に変更しました。
    abort(400)
    #以下は実行されない
    this_is_never_executed()

エラーハンドラを定義してみます。werkzeugというものを使ってエラーハンドラを定義する方法です。「application.py」に以下のプログラムを追加します。

#エラーハンドラを定義① werkzeugの利用
from werkzeug.exceptions import BadRequest
@app.errorhandler(BadRequest)
def handle_bad_request(e):
    return 'bad communication!', 400

さりげなくB’z

これで、ブラウザをリロードしてみます。

自分で定義した400の表示内容となっています。returnに、HTMLテンプレートをrender_templateすれば、HTMLでより複雑なエラーページを定義することができます。

もう一つのやり方でもやってみます。次のようにプログラムを修正します。

'''
#エラーハンドラを定義① werkzeugの利用
from werkzeug.exceptions import BadRequest
@app.errorhandler(BadRequest)
def handle_bad_request(e):
    return 'bad communication!', 400
'''
#エラーハンドラを定義②
def handle_bad_request(e):
    return 'bad communication!', 400
# or, without the decorator
app.register_error_handler(400, handle_bad_request)

こっちのやり方でも、オリジナルの400エラーページを表示することができました。

オリジナルのエラーページは結構実装しそうなので、少し踏み込んで試してみました。werkzeugがなんなのか、など調べましたが、まだ自分の知識として落とし込めていないので、今回は、エラーページをオリジナルにカスタマイズする、というやり方の一つとしてこのようにできるんだ、という理解に止まっています。クイックスタートはまた別の項目へいきますので、今後より詳細に知る必要があった時に理解を進めようと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次