序章

Flask は、Python言語でWebアプリケーションを作成するための便利なツールと機能を提供する軽量のPythonWebフレームワークです。

Webアプリケーションを開発しているとき、必然的に、アプリケーションが予想とは逆の動作をする状況に遭遇します。 変数のスペルを間違えたり、誤用したりする可能性があります for ループするか、 if 宣言する前に関数を呼び出す、または単に存在しないページを探すなど、Python例外を発生させる方法でステートメントを記述します。 エラーと例外を適切に処理する方法を学ぶと、Flaskアプリケーションの開発がより簡単かつスムーズになります。

このチュートリアルでは、Webアプリケーションの開発時に発生する一般的なエラーを処理する方法を示す小さなWebアプリケーションを作成します。 カスタムエラーページを作成し、Flaskデバッガーを使用して例外のトラブルシューティングを行い、ログを使用してアプリケーションのイベントを追跡します。

前提条件

ステップ1—フラスコデバッガーの使用

このステップでは、いくつかのエラーがあるアプリケーションを作成し、デバッグモードなしで実行して、アプリケーションがどのように応答するかを確認します。 次に、デバッグモードをオンにして実行し、デバッガーを使用してアプリケーションエラーのトラブルシューティングを行います。

プログラミング環境をアクティブにしてFlaskをインストールした状態で、次のファイルを開きます。 app.py あなたの中で編集するため flask_app ディレクトリ:

  1. nano app.py

内に次のコードを追加します app.py ファイル:

フラスコ_app/app.py
from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')

上記のコードでは、最初に Flask からのクラス flask パッケージ。 次に、Flaskアプリケーションインスタンスを作成します。 app. あなたは @app.route() と呼ばれるビュー関数を作成するデコレータ index()、を呼び出します render_template() 戻り値として機能します。これにより、次のテンプレートがレンダリングされます。 index.html. このコードには2つのエラーがあります。1つは、インポートしなかったことです。 render_template() 機能、そして2番目のものは index.html テンプレートファイルが存在しません。

ファイルを保存して閉じます。

次に、を使用してアプリケーションについてFlaskに通知します FLASK_APP 次のコマンドを使用した環境変数(Windowsでは、 set それ以外の export):

  1. export FLASK_APP=app

次に、を使用してアプリケーションサーバーを実行します flask run 指図:

  1. flask run

ターミナルに次の情報が表示されます。

Output
* Serving Flask app 'app' (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

この出力は、次の情報を提供します。

  • 提供されているFlaskアプリケーション(app.py この場合)

  • である環境 production ここ。 警告メッセージは、このサーバーが実稼働環境用ではないことを強調しています。 このサーバーを開発に使用しているため、この警告は無視してかまいませんが、詳細については、Flaskドキュメントの展開オプションページを参照してください。 このFlaskデプロイメントチュートリアルをGunicornで、またはこれをuWSGI でチェックすることもできます。または、DigitalOcean App Platformを使用して、HowToに従ってFlaskアプリケーションをデプロイすることもできます。 Gunicornを使用してFlaskアプリをAppPlatformチュートリアルにデプロイします。

  • デバッグモードがオフになっているため、Flaskデバッガーが実行されておらず、アプリケーションで役立つエラーメッセージが表示されません。 本番環境では、詳細なエラーを表示すると、アプリケーションがセキュリティの脆弱性にさらされます。

  • サーバーはで実行されています http://127.0.0.1:5000/ URL。 サーバーを停止するには、 CTRL+C、しかし、まだそれをしないでください。

次に、ブラウザを使用してインデックスページにアクセスします。

http://127.0.0.1:5000/

次のようなメッセージが表示されます。

Output
Internal Server Error The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

これは500内部サーバーエラーであり、サーバーがアプリケーションコードで内部エラーを検出したことを示すサーバーエラー応答です。

ターミナルに、次の出力が表示されます。

Output
[2021-09-12 15:16:56,441] ERROR in app: Exception on / [GET] Traceback (most recent call last): File "/home/abd/.local/lib/python3.9/site-packages/flask/app.py", line 2070, in wsgi_app response = self.full_dispatch_request() File "/home/abd/.local/lib/python3.9/site-packages/flask/app.py", line 1515, in full_dispatch_request rv = self.handle_user_exception(e) File "/home/abd/.local/lib/python3.9/site-packages/flask/app.py", line 1513, in full_dispatch_request rv = self.dispatch_request() File "/home/abd/.local/lib/python3.9/site-packages/flask/app.py", line 1499, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "/home/abd/python/flask/series03/flask_app/app.py", line 8, in index return render_template('index.html') NameError: name 'render_template' is not defined 127.0.0.1 - - [12/Sep/2021 15:16:56] "GET / HTTP/1.1" 500 -

上記のトレースバックは、内部サーバーエラーをトリガーしたコードを通過します。 この線 NameError: name 'render_template' is not defined 問題の根本的な原因を示します: render_template() 関数はインポートされていません。

ここに表示されているように、エラーのトラブルシューティングを行うためにターミナルに移動する必要がありますが、これは便利ではありません。

開発サーバーでデバッグモードを有効にすることで、トラブルシューティングをより適切に行うことができます。 これを行うには、サーバーを停止します CTRL+C 環境変数を設定します FLASK_ENVdevelopment、したがって、次のコマンドを使用して、アプリケーションを開発モード(デバッガーを有効にする)で実行できます(Windowsでは、 set それ以外の export):

  1. export FLASK_ENV=development

開発サーバーを実行します。

  1. flask run

ターミナルに次のような出力が表示されます。

Output
* Serving Flask app 'app' (lazy loading) * Environment: development * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 120-484-907

ここで、環境が現在あることがわかります development、デバッグモードがオンで、デバッガーがアクティブです。 The Debugger PIN は、ブラウザでコンソールのロックを解除するために必要なPINです(下の画像で囲まれている小さなターミナルアイコンをクリックするとアクセスできるインタラクティブなPythonシェル)。

ブラウザのインデックスページを更新すると、次のページが表示されます。

ここでは、わかりやすい方法でエラーメッセージが表示されています。 最初の見出しは、問題の原因となったPython例外の名前(この場合は NameError )を示しています。 2行目はあなたに直接の理由を与えます(render_template() は定義されていません。つまり、この場合はインポートされません)。 その後、実行された内部フラスココードをトレースバックします。 トレースバックの最後の行には通常最も有用な情報があるため、トレースバックを下から上に読んでください。

注:丸で囲まれた端末アイコンを使用すると、ブラウザーでさまざまなフレームでPythonコードを実行できます。 これは、Pythonインタラクティブシェルで行うのと同じ方法で変数の値をチェックする場合に役立ちます。 ターミナルアイコンをクリックするときは、サーバーの実行時に取得したデバッガーのPINコードを入力する必要があります。 このチュートリアルでは、このインタラクティブシェルは必要ありません。

これを修正するには NameError 問題を解決し、サーバーを実行したままにして、新しいターミナルウィンドウを開き、環境をアクティブ化して、 app.py ファイル:

  1. nano app.py

次のようにファイルを変更します。

フラスコ_app/app.py

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')

ファイルを保存して閉じます。

ここでインポートしました render_template() 欠落していた関数。

開発サーバーが実行されている状態で、ブラウザーのインデックスページを更新します。

今回は、次のような情報を含むエラーページが表示されます。

Output
jinja2.exceptions.TemplateNotFound jinja2.exceptions.TemplateNotFound: index.html

このエラーメッセージは、 index.html テンプレートが存在しません。

これを修正するには、を作成します base.html コードの繰り返しを避けるために他のテンプレートが継承するテンプレートファイル、次に index.html 基本テンプレートを拡張するテンプレート。

を作成します templates ディレクトリ。Flaskがテンプレートファイルを探すディレクトリです。 次に、 base.html お気に入りのエディタを使用したファイル:

  1. mkdir templates
  2. nano templates/base.html

次のコードをに追加します base.html ファイル:

フラスコ_app/templates / base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %} - FlaskApp</title>
    <style>
        nav a {
            color: #d64161;
            font-size: 3em;
            margin-left: 50px;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <nav>
        <a href="{{ url_for('index') }}">FlaskApp</a>
        <a href="#">About</a>
    </nav>
    <hr>
    <div class="content">
        {% block content %} {% endblock %}
    </div>
</body>
</html>

ファイルを保存して閉じます。

この基本テンプレートには、他のテンプレートで再利用する必要があるすべてのHTMLボイラープレートが含まれています。 The title 各ページのタイトルを設定するためにブロックが置き換えられ、 content ブロックは各ページのコンテンツに置き換えられます。 ナビゲーションバーには2つのリンクがあります。1つは、を使用するインデックスページ用です。 url_for() リンクするヘルパー関数 index() 表示機能、およびアプリケーションに1つを含めることを選択した場合は、[バージョン情報]ページ用のもう1つ。

次に、というテンプレートファイルを開きます index.html、ベーステンプレートから継承します。

  1. nano templates/index.html

次のコードを追加します。

フラスコ_app/templates / index.html
{% extends 'base.html' %}

{% block content %}
    <h1>{% block title %} Index {% endblock %}</h1>
    <h2>Welcome to FlaskApp!</h2>
{% endblock %}

ファイルを保存して閉じます。

上記のコードでは、ベーステンプレートを拡張し、 content ブロック。 次に、ページタイトルを設定し、 H1 を使用したヘッダー title ブロックし、挨拶を表示します H2 ヘッダ。

開発サーバーが実行されている状態で、ブラウザーのインデックスページを更新します。

アプリケーションにエラーが表示されなくなり、インデックスページが期待どおりに表示されることがわかります。

これで、デバッグモードを使用して、エラーメッセージを処理する方法を確認しました。 次に、選択したエラーメッセージで応答するリクエストを中止し、カスタムエラーページで応答する方法を確認します。

ステップ2—カスタムエラーページを作成する

このステップでは、リクエストを中止し、ユーザーがサーバーに存在しないデータをリクエストした場合に404HTTPエラーメッセージで応答する方法を学習します。 また、次のような一般的なHTTPエラーのカスタムエラーページを作成する方法についても学習します。 404 Not Found エラー、および 500 Internal Server Error エラー。

リクエストを中止してカスタム404HTTPエラーページで応答する方法を示すために、いくつかのメッセージを表示するページを作成します。 要求されたメッセージが存在しない場合は、404エラーで応答します。

まず、 app.py メッセージページの新しいルートを追加するファイル:

  1. nano app.py

ファイルの最後に次のルートを追加します。

フラスコ_app/app.py
# ...

@app.route('/messages/<int:idx>')
def message(idx):
    messages = ['Message Zero', 'Message One', 'Message Two']
    return render_template('message.html', message=messages[idx])

ファイルを保存して閉じます。

上記のルートでは、URL変数があります idx. これは、表示されるメッセージを決定するインデックスです。 たとえば、URLが /messages/0、最初のメッセージ(Message Zero)が表示されます。 URL変数にはデフォルトで文字列値があるため、intコンバーターを使用して正の整数のみを受け入れます。

内部 message() ビュー関数、あなたはと呼ばれる通常のPythonリストを持っています messages 3つのメッセージで。 (実際のシナリオでは、これらのメッセージはデータベース、API、または別の外部データソースから送信されます。)この関数は、 render_template() 2つの引数を持つ関数、 message.html テンプレートファイルとして、および message テンプレートに渡される変数。 この変数には、 messages の値に応じたリスト idx URLの変数。

次に新しいを開きます message.html テンプレートファイル:

  1. nano templates/message.html

次のコードを追加します。

フラスコ_app/templates / message.html
{% extends 'base.html' %}

{% block content %}
    <h1>{% block title %} Messages {% endblock %}</h1>
    <h2>{{ message }}</h2>
{% endblock %}

ファイルを保存して閉じます。

上記のコードでは、ベーステンプレートを拡張し、 content ブロック。 タイトルを追加します(Messages)H1見出しに、の値を表示します message H2見出しの変数。

開発サーバーが実行されている状態で、ブラウザーで次のURLにアクセスします。

http://127.0.0.1:5000/messages/0
http://127.0.0.1:5000/messages/1
http://127.0.0.1:5000/messages/2
http://127.0.0.1:5000/messages/3

あなたはそれを見るでしょう H2 テキストが含まれています Message Zero, Message One、 また Message Two それぞれ最初の3つのURLのそれぞれに。 ただし、4番目のURLでは、サーバーは次のように応答します。 IndexError: list index out of range エラーメッセージ。 実稼働環境では、応答は 500 Internal Server Error、しかしここでの適切な応答は 404 Not Found サーバーがインデックスが 3.

あなたはで応答することができます 404 Flaskを使用したエラー abort() ヘルパー関数。 これを行うには、を開きます app.py ファイル:

  1. nano app.py

最初の行を編集してインポートします abort() 関数。 次に、 message() を追加して機能を表示する試す … 節を除く以下の強調表示された部分に示されているように:

フラスコ_app/app.py
from flask import Flask, render_template, abort

# ...
# ...


@app.route('/messages/<int:idx>')
def message(idx):
    messages = ['Message Zero', 'Message One', 'Message Two']
    try:
        return render_template('message.html', message=messages[idx])
    except IndexError:
        abort(404)

ファイルを保存して閉じます。

上記のコードでは、 abort()関数をインポートします。この関数を使用して、リクエストを中止し、エラーで応答します。 の中に message() ビュー機能、あなたは使用します try ... except 関数をラップする句。 あなたは最初に返そうとします messages URLのインデックスに対応するメッセージを含むテンプレート。 インデックスに対応するメッセージがない場合、 IndexError 例外が発生します。 次に、 except そのエラーをキャッチする句、そしてあなたは abort(404) リクエストを中止し、 404 Not Found HTTPエラー。

開発サーバーが実行されている状態で、ブラウザを使用して、応答したURLに再度アクセスします。 IndexError 以前(または2より大きいインデックスを持つ任意のURLにアクセス):

http://127.0.0.1:5000/messages/3

次の応答が表示されます。

Not Found

The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

これで、サーバーが要求されたメッセージを見つけることができなかったことを示す、より適切なエラーメッセージが表示されます。

次に、404エラーページ用のテンプレートと500エラーページ用のテンプレートを作成します。

まず、関数をスペシャルに登録します @app.errorhandler() のハンドラとしてのデコレータ 404 エラー。 を開きます app.py 編集用ファイル:

nano app.py

次のように強調表示された部分を追加して、ファイルを編集します。

フラスコ_app/app.py
from flask import Flask, render_template, abort

app = Flask(__name__)


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


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/messages/<int:idx>')
def message(idx):
    messages = ['Message Zero', 'Message One', 'Message Two']
    try:
        return render_template('message.html', message=messages[idx])
    except IndexError:
        abort(404)

ファイルを保存して閉じます。

ここでは、 @app.errorhandler() 関数を登録するデコレータ page_not_found() カスタムエラーハンドラとして。 この関数はエラーを引数として受け取り、への呼び出しを返します。 render_template() と呼ばれるテンプレートで関数 404.html. このテンプレートは後で作成します。必要に応じて別の名前を使用できます。 また、整数を返します 404 後に render_template() 電話。 これは、応答のステータスコードが次のようになる必要があることをFlaskに通知します 404. 追加しない場合、デフォルトのステータスコード応答は 200 になります。これは、リクエストが成功したことを意味します。

次に、新しい 404.html テンプレート:

  1. nano templates/404.html

次のコードを追加します。

フラスコ_app/templates / 404.html
{% extends 'base.html' %}

{% block content %}
        <h1>{% block title %} 404 Not Found. {% endblock %}</h1>
        <p>OOPS! Sammy couldn't find your page; looks like it doesn't exist.</p>
        <p>If you entered the URL manually, please check your spelling and try again.</p>
{% endblock %}

ファイルを保存して閉じます。

他のテンプレートと同じように、ベーステンプレートを拡張し、コンテンツを置き換えます。 contenttitle ブロックし、独自のHTMLコードを追加します。 ここにあなたがいます <h1> タイトルとしての見出し、 <p> ページが見つからなかったことをユーザーに通知するカスタムエラーメッセージと、URLを手動で入力した可能性のあるユーザーに役立つメッセージをタグ付けします。

他のテンプレートと同じように、エラーページで必要なHTML、CSS、およびJavaScriptを使用できます。

開発サーバーが実行されている状態で、ブラウザーを使用して次のURLに再度アクセスします。

http://127.0.0.1:5000/messages/3

このページには、ベーステンプレートにあるナビゲーションバーとカスタムエラーメッセージが表示されます。

同様に、カスタムエラーページを追加できます 500 Internal Server Error エラー。 を開きます app.py ファイル:

  1. nano app.py

次のエラーハンドラを下に追加します 404 エラーハンドラ:

フラスコ_app/app.py
# ...

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


@app.errorhandler(500)
def internal_error(error):
    return render_template('500.html'), 500

# ...

ここでは、 404 エラーハンドラ。 あなたは app.errorhandler() デコレータ 500 と呼ばれる関数を作成するための引数 internal_error() エラーハンドラに。 と呼ばれるテンプレートをレンダリングします 500.html、およびステータスコードで応答します 500.

次に、カスタムエラーがどのように表示されるかを示すために、 500 ファイルの終わりでのHTTPエラー。 このルートは常に 500 Internal Server Error デバッガーが実行されているかどうかに関係なく、次のようになります。

フラスコ_app/app.py

# ...
@app.route('/500')
def error500():
    abort(500)

ここでルートを作成します /500 を使用します abort() で応答する関数 500 HTTPエラー。

ファイルを保存して閉じます。

次に、新しい 500.html テンプレート:

  1. nano templates/500.html

次のコードを追加します。

フラスコ_app/templates / 500.html
{% extends 'base.html' %}

{% block content %}
        <h1>{% block title %} 500 Internal Server Error {% endblock %}</h1>
        <p>OOOOPS! Something went wrong on the server.</p>
        <p>Sammy is currently working on this issue. Please try again later.</p>
{% endblock %}

ファイルを保存して閉じます。

ここでは、あなたがしたのと同じことをします 404.html テンプレート。 基本テンプレートを拡張し、コンテンツブロックをタイトルと内部サーバーエラーについてユーザーに通知する2つのカスタムメッセージに置き換えます。

開発サーバーが実行されている状態で、次のように応答するルートにアクセスします。 500 エラー:

http://127.0.0.1:5000/500

一般的なエラーページの代わりにカスタムページが表示されます。

これで、FlaskアプリケーションでHTTPエラーのカスタムエラーページを使用する方法がわかりました。 次に、ロギングを使用してアプリケーションのイベントを追跡する方法を学習します。 イベントの追跡は、コードの動作を理解するのに役立ち、開発とトラブルシューティングに役立ちます。

ステップ3—ロギングを使用してアプリケーションのイベントを追跡する

このステップでは、ロギングを使用して、サーバーが実行され、アプリケーションが使用されているときに発生するイベントを追跡します。これにより、アプリケーションコードで何が起こっているかを確認できるため、エラーのトラブルシューティングを簡単に行うことができます。

開発サーバーが実行されているときはいつでも、ログをすでに確認しています。これは通常、次のようになります。

127.0.0.1 - - [21/Sep/2021 14:36:45] "GET /messages/1 HTTP/1.1" 200 -
127.0.0.1 - - [21/Sep/2021 14:36:52] "GET /messages/2 HTTP/1.1" 200 -
127.0.0.1 - - [21/Sep/2021 14:36:54] "GET /messages/3 HTTP/1.1" 404 -

これらのログには、次の情報が表示されます。

  • 127.0.0.1:サーバーが実行されていたホスト。
  • [21/Sep/2021 14:36:45]:リクエストの日時。
  • GETHTTPリクエストメソッド。 この場合、 GET データを取得するために使用されます。
  • /messages/2:ユーザーが要求したパス。
  • HTTP/1.1:HTTPバージョン。
  • 200 また 404:応答のステータスコード。

これらのログは、アプリケーションで発生する問題を診断するのに役立ちます。 ロガーを使用して特定のリクエストに関する詳細を知りたい場合は、より多くの情報をログに記録できます app.logger Flaskが提供します。

ロギングを使用すると、さまざまな機能を使用して、さまざまなロギングレベルに関する情報をレポートできます。 各レベルは、ある程度の重大度で発生したイベントを示します。 次の機能を使用できます。

  • app.logger.debug():イベントの詳細については。
  • app.logger.info():物事が期待どおりに機能していることの確認。
  • app.logger.warning():予期しないことが発生したことを示します(「ディスク容量が不足しています」など)が、アプリケーションは期待どおりに動作しています。
  • app.logger.error():アプリケーションの一部でエラーが発生しました。
  • app.logger.critical():重大なエラー。 アプリケーション全体が機能しなくなる可能性があります。

Flaskロガーの使用方法を示すには、 app.py いくつかのイベントをログに記録するための編集用ファイル:

  1. nano app.py

編集します message() 次のように見える関数を表示します。

フラスコ_app/app.py

# ...

@app.route('/messages/<int:idx>')
def message(idx):
    app.logger.info('Building the messages list...')
    messages = ['Message Zero', 'Message One', 'Message Two']
    try:
        app.logger.debug('Get message with index: {}'.format(idx))
        return render_template('message.html', message=messages[idx])
    except IndexError:
        app.logger.error('Index {} is causing an IndexError'.format(idx))
        abort(404)

# ...

ファイルを保存して閉じます。

ここでは、さまざまなレベルでいくつかのイベントをログに記録しました。 あなたが使う app.logger.info() 期待どおりに機能しているイベントをログに記録します(これは INFO レベル)。 あなたが使う app.logger.debug() 詳細については(DEBUG レベル)、アプリケーションが特定のインデックスを持つメッセージを取得していることに言及します。 次に、 app.logger.error() その事実をログに記録するには IndexError 問題の原因となった特定のインデックスで例外が発生しました(ERROR レベル、エラーが発生したため)。

次のURLにアクセスしてください。

http://127.0.0.1:5000/messages/1

サーバーが実行されているターミナルに次の情報が表示されます。

Output
[2021-09-21 15:17:02,625] INFO in app: Building the messages list... [2021-09-21 15:17:02,626] DEBUG in app: Get message with index: 1 127.0.0.1 - - [21/Sep/2021 15:17:02] "GET /messages/1 HTTP/1.1" 200 -

ここにあなたは INFO メッセージ app.logger.info() ログ、および DEBUG を使用してログに記録したインデックス番号のメッセージ app.logger.debug().

次に、存在しないメッセージのURLにアクセスします。

http://127.0.0.1:5000/messages/3

ターミナルに次の情報が表示されます。

Output
[2021-09-21 15:33:43,899] INFO in app: Building the messages list... [2021-09-21 15:33:43,899] DEBUG in app: Get message with index: 3 [2021-09-21 15:33:43,900] ERROR in app: Index 3 is causing an IndexError 127.0.0.1 - - [21/Sep/2021 15:33:43] "GET /messages/3 HTTP/1.1" 404 -

ご覧のとおり、 INFODEBUG 以前に見たログと新しい ERROR インデックスが 3 存在しません。

イベント、詳細情報、およびエラーをログに記録すると、問題が発生した場所を特定し、トラブルシューティングを容易にすることができます。

このステップでは、Flaskロガーの使用方法を学習しました。 ロギングの理解を深めるには、 Python3でロギングを使用する方法を確認してください。 ロギングの詳細については、Flaskロギングドキュメントおよびロギングに関するPythonドキュメントを参照してください。

結論

これで、Flaskでデバッグモードを使用する方法と、FlaskWebアプリケーションの開発時に発生する可能性のあるいくつかの一般的なエラーをトラブルシューティングして修正する方法を理解できました。 また、一般的なHTTPエラーのカスタムエラーページを作成し、Flaskロガーを使用してアプリケーションのイベントを追跡し、アプリケーションの動作を検査および把握できるようにしました。

Flaskの詳細については、Flaskトピックページをご覧ください。