Flaskアプリケーションでエラーを処理する方法
序章
Flask は、Python言語でWebアプリケーションを作成するための便利なツールと機能を提供する軽量のPythonWebフレームワークです。
Webアプリケーションを開発しているとき、必然的に、アプリケーションが予想とは逆の動作をする状況に遭遇します。 変数のスペルを間違えたり、誤用したりする可能性があります for
ループするか、 if
宣言する前に関数を呼び出す、または単に存在しないページを探すなど、Python例外を発生させる方法でステートメントを記述します。 エラーと例外を適切に処理する方法を学ぶと、Flaskアプリケーションの開発がより簡単かつスムーズになります。
このチュートリアルでは、Webアプリケーションの開発時に発生する一般的なエラーを処理する方法を示す小さなWebアプリケーションを作成します。 カスタムエラーページを作成し、Flaskデバッガーを使用して例外のトラブルシューティングを行い、ログを使用してアプリケーションのイベントを追跡します。
前提条件
-
ローカルのPython3プログラミング環境。 Python3シリーズのローカルプログラミング環境をインストールおよびセットアップする方法」シリーズのディストリビューションのチュートリアルに従うことができます。 このチュートリアルでは、プロジェクトディレクトリを呼び出します
flask_app
. -
ルート、ビュー関数、テンプレートなどの基本的なFlaskの概念の理解。 Flaskに慣れていない場合は、FlaskとPythonを使用して最初のWebアプリケーションを作成する方法およびFlaskアプリケーションでテンプレートを使用する方法を確認してください。
-
基本的なHTMLの概念の理解。 背景知識については、HTMLを使用してWebサイトを構築する方法チュートリアルシリーズを確認できます。
ステップ1—フラスコデバッガーの使用
このステップでは、いくつかのエラーがあるアプリケーションを作成し、デバッグモードなしで実行して、アプリケーションがどのように応答するかを確認します。 次に、デバッグモードをオンにして実行し、デバッガーを使用してアプリケーションエラーのトラブルシューティングを行います。
プログラミング環境をアクティブにしてFlaskをインストールした状態で、次のファイルを開きます。 app.py
あなたの中で編集するため flask_app
ディレクトリ:
- nano app.py
内に次のコードを追加します 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
):
- export FLASK_APP=app
次に、を使用してアプリケーションサーバーを実行します flask run
指図:
- 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/
次のようなメッセージが表示されます。
OutputInternal 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_ENV
に development
、したがって、次のコマンドを使用して、アプリケーションを開発モード(デバッガーを有効にする)で実行できます(Windowsでは、 set
それ以外の export
):
- export FLASK_ENV=development
開発サーバーを実行します。
- 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
ファイル:
- nano app.py
次のようにファイルを変更します。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
ファイルを保存して閉じます。
ここでインポートしました render_template()
欠落していた関数。
開発サーバーが実行されている状態で、ブラウザーのインデックスページを更新します。
今回は、次のような情報を含むエラーページが表示されます。
Outputjinja2.exceptions.TemplateNotFound
jinja2.exceptions.TemplateNotFound: index.html
このエラーメッセージは、 index.html
テンプレートが存在しません。
これを修正するには、を作成します base.html
コードの繰り返しを避けるために他のテンプレートが継承するテンプレートファイル、次に index.html
基本テンプレートを拡張するテンプレート。
を作成します templates
ディレクトリ。Flaskがテンプレートファイルを探すディレクトリです。 次に、 base.html
お気に入りのエディタを使用したファイル:
- mkdir templates
- nano templates/base.html
次のコードをに追加します 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
、ベーステンプレートから継承します。
- nano 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
メッセージページの新しいルートを追加するファイル:
- nano 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
テンプレートファイル:
- nano 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
ファイル:
- nano app.py
最初の行を編集してインポートします abort()
関数。 次に、 message()
を追加して機能を表示する
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
次のように強調表示された部分を追加して、ファイルを編集します。
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
テンプレート:
- nano 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 %}
ファイルを保存して閉じます。
他のテンプレートと同じように、ベーステンプレートを拡張し、コンテンツを置き換えます。 content
と title
ブロックし、独自のHTMLコードを追加します。 ここにあなたがいます <h1>
タイトルとしての見出し、 <p>
ページが見つからなかったことをユーザーに通知するカスタムエラーメッセージと、URLを手動で入力した可能性のあるユーザーに役立つメッセージをタグ付けします。
他のテンプレートと同じように、エラーページで必要なHTML、CSS、およびJavaScriptを使用できます。
開発サーバーが実行されている状態で、ブラウザーを使用して次のURLに再度アクセスします。
http://127.0.0.1:5000/messages/3
このページには、ベーステンプレートにあるナビゲーションバーとカスタムエラーメッセージが表示されます。
同様に、カスタムエラーページを追加できます 500 Internal Server Error
エラー。 を開きます app.py
ファイル:
- nano app.py
次のエラーハンドラを下に追加します 404
エラーハンドラ:
# ...
@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.route('/500')
def error500():
abort(500)
ここでルートを作成します /500
を使用します abort()
で応答する関数 500
HTTPエラー。
ファイルを保存して閉じます。
次に、新しい 500.html
テンプレート:
- nano 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]
:リクエストの日時。GET
:HTTPリクエストメソッド。 この場合、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
いくつかのイベントをログに記録するための編集用ファイル:
- nano app.py
編集します message()
次のように見える関数を表示します。
# ...
@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 -
ご覧のとおり、 INFO
と DEBUG
以前に見たログと新しい ERROR
インデックスが 3
存在しません。
イベント、詳細情報、およびエラーをログに記録すると、問題が発生した場所を特定し、トラブルシューティングを容易にすることができます。
このステップでは、Flaskロガーの使用方法を学習しました。 ロギングの理解を深めるには、 Python3でロギングを使用する方法を確認してください。 ロギングの詳細については、Flaskロギングドキュメントおよびロギングに関するPythonドキュメントを参照してください。
結論
これで、Flaskでデバッグモードを使用する方法と、FlaskWebアプリケーションの開発時に発生する可能性のあるいくつかの一般的なエラーをトラブルシューティングして修正する方法を理解できました。 また、一般的なHTTPエラーのカスタムエラーページを作成し、Flaskロガーを使用してアプリケーションのイベントを追跡し、アプリケーションの動作を検査および把握できるようにしました。
Flaskの詳細については、Flaskトピックページをご覧ください。