著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
Flask は、Python言語でWebアプリケーションを作成するための便利なツールと機能を提供する軽量のPythonWebフレームワークです。 単一のPythonファイルのみを使用してWebアプリケーションをすばやく構築できるため、開発者に柔軟性を提供し、新しい開発者がアクセスできるフレームワークになります。 Flaskも拡張可能であり、特定のディレクトリ構造を強制したり、開始する前に複雑なボイラープレートコードを必要としたりすることはありません。
Flaskを学ぶことで、PythonでWebアプリケーションをすばやく作成できるようになります。 Pythonライブラリを利用して、データをデータベースに保存したり、Webフォームを検証したりするなど、Webアプリケーションに高度な機能を追加できます。
このチュートリアルでは、ブラウザでHTMLテキストをレンダリングする小さなWebアプリケーションを作成します。 Flaskをインストールし、Flaskアプリケーションを作成して実行し、アプリケーションを開発モードで実行します。 ルーティングを使用して、Webアプリケーションでさまざまな目的に役立つさまざまなWebページを表示します。 また、ビュー機能を使用して、ユーザーが動的ルートを介してアプリケーションと対話できるようにします。 最後に、デバッガーを使用してエラーのトラブルシューティングを行います。
前提条件
- ローカルのPython3プログラミング環境。 Python3シリーズのローカルプログラミング環境をインストールおよびセットアップする方法のチュートリアルに従ってください。 このチュートリアルでは、プロジェクトディレクトリを
flask_app
と呼びます。 - データ型、リスト、関数などの基本的なPython3の概念の理解。 Pythonに慣れていない場合は、 Python3シリーズのコーディング方法を確認してください。
- 基本的なHTMLの概念の理解。 背景知識については、HTMLを使用してWebサイトを構築する方法チュートリアルシリーズを確認できます。
ステップ1—Flaskのインストール
このステップでは、Python環境をアクティブ化し、pipパッケージインストーラーを使用してFlaskをインストールします。
まず、プログラミング環境をまだアクティブにしていない場合はアクティブにします。
source env/bin/activate
プログラミング環境をアクティブにしたら、pip install
コマンドを使用してFlaskをインストールします。
pip install flask
インストールが完了すると、次のように、出力の最後の部分にインストールされているパッケージのリストが表示されます。
Output... Installing collected packages: Werkzeug, MarkupSafe, Jinja2, itsdangerous, click, flask Successfully installed Jinja2-3.0.1 MarkupSafe-2.0.1 Werkzeug-2.0.1 click-8.0.1 flask-2.0.1 itsdangerous-2.0.1
これは、Flaskをインストールすると、他のいくつかのパッケージもインストールされたことを意味します。 これらのパッケージは、Flaskがさまざまな機能を実行するために必要な依存関係です。
プロジェクトフォルダ、仮想環境を作成し、Flaskをインストールしました。 これで、簡単なアプリケーションのセットアップに進むことができます。
ステップ2—簡単なアプリケーションを作成する
プログラミング環境がセットアップされたので、Flaskの使用を開始します。 このステップでは、Pythonファイル内に小さなFlask Webアプリケーションを作成します。このアプリケーションでは、ブラウザーに表示するHTMLコードを記述します。
flask_app
ディレクトリで、app.py
という名前のファイルを開いて編集し、nano
またはお気に入りのテキストエディタを使用します。
nano app.py
app.py
ファイル内に次のコードを記述します。
フラスコ_app/app.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return '<h1>Hello, World!</h1>'
ファイルを保存して閉じます。
上記のコードブロックでは、最初にFlask
オブジェクトをflask
パッケージからインポートします。 次に、それを使用してFlaskアプリケーションインスタンスを作成し、app
という名前を付けます。 現在のPythonモジュールの名前を保持する特別な変数__name__
を渡します。 この名前は、それが配置されているインスタンスを示します。 Flaskが舞台裏でいくつかのパスを設定するため、これが必要です。
app
インスタンスを作成すると、それを使用して着信Web要求を処理し、ユーザーに応答を送信できます。 @app.route
はデコレータであり、通常のPython関数をFlask ビュー関数に変換します。これにより、関数の戻り値がHTTP応答に変換されてHTTPクライアントで表示されます。 、Webブラウザなど。 値'/'
を@app.route()
に渡して、この関数がメインURLであるURL/
に対するWeb要求に応答することを示します。
hello()
ビュー関数は、文字列'<h1>Hello, World!</h1>'
をHTTP応答として返します。
これで、app.py
というPythonファイルに単純なFlaskアプリケーションが作成されました。次のステップでは、アプリケーションを実行して、Webブラウザーでレンダリングされたhello()
ビュー関数の結果を確認します。
ステップ3—アプリケーションの実行
Flaskアプリケーションを含むファイルを作成したら、Flaskコマンドラインインターフェイスを使用してファイルを実行し、開発サーバーを起動して、hello()
ビュー関数の戻り値として記述したHTMLコードをブラウザーにレンダリングします。前のステップで。
まず、仮想環境がアクティブになっているflask_app
ディレクトリで、次のコマンドを使用してFLASK_APP
環境変数を使用して、アプリケーション(この場合はapp.py
)の場所をFlaskに指示します。 (Windowsでは、export
の代わりにset
を使用します):
export FLASK_APP=app
次に、FLASK_ENV
環境変数を使用して、アプリケーションを開発モードで実行することを指定します(これにより、デバッガーを使用してエラーをキャッチできます)。
export FLASK_ENV=development
最後に、flask run
コマンドを使用してアプリケーションを実行します。
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: 296-353-699
上記の出力には、次のようないくつかの情報が含まれています。
- 実行しているアプリケーションの名前(
"app"
)。 - アプリケーションが実行されている環境(
development
)。 Debug mode: on
は、Flaskデバッガーが実行中であることを示します。 これは、問題が発生したときに詳細なエラーメッセージを提供し、トラブルシューティングを容易にするため、開発時に役立ちます。- アプリケーションは、URL
http://127.0.0.1:5000/
でローカルに実行されています。127.0.0.1
は、マシンのlocalhost
を表すIPであり、:5000
はポート番号です。
ブラウザを開き、URLhttp://127.0.0.1:5000/
を入力します。 <h1>
の見出しにHello, World!
というテキストが応答として表示されます。 これにより、アプリケーションが正常に実行されていることが確認されます。
開発サーバーを停止する場合は、CTRL+C
を押してください。
警告: Flaskは、シンプルなWebサーバーを使用して、開発環境でアプリケーションを提供します。これは、Flaskデバッガーが実行されているため、エラーの検出が容易になることも意味します。 この開発サーバーを実稼働環境で使用しないでください。 詳細については、Flaskドキュメントの展開オプションページを参照してください。 このFlaskデプロイメントチュートリアルをGunicornで、またはこれをuWSGI でチェックすることもできます。または、DigitalOcean App Platformを使用して、 How ToDeployaを使用してFlaskアプリケーションをデプロイすることもできます。 Gunicornを使用したFlaskアプリからAppPlatformチュートリアル。
app.py
アプリケーションの開発を続行するには、開発サーバーを実行したままにして、別のターミナルウィンドウを開きます。 flask_app
ディレクトリに移動し、仮想環境をアクティブにして、環境変数FLASK_ENV
およびFLASK_APP
を設定し、次の手順に進みます。 (これらのコマンドは、このステップの前半にリストされています。)
注:新しい端末を開くとき、または開発サーバーを実行している端末を閉じて再実行するときは、仮想環境のアクティブ化と環境変数の設定を覚えておくことが重要ですFLASK_ENV
およびFLASK_APP
。
サーバーを実行する必要があるのは、1つのターミナルウィンドウで1回だけです。
Flaskアプリケーションの開発サーバーがすでに実行されている間は、同じflask run
コマンドで別のFlaskアプリケーションを実行することはできません。 これは、flask run
がデフォルトでポート番号5000
を使用し、それが取得されると、別のアプリケーションを実行できなくなるため、次のようなエラーが発生するためです。
OutputOSError: [Errno 98] Address already in use
この問題を解決するには、現在CTRL+C
で実行されているサーバーを停止してから、flask run
を再度実行するか、両方のアプリケーションを同時に実行する場合は、別のポート番号を渡すことができます。 -p
引数に、たとえば、ポート5001
で別のアプリケーションを実行するには、次のコマンドを使用します。
flask run -p 5001
これにより、必要に応じて、1つのアプリケーションをhttp://127.0.0.1:5000/
で実行し、別のアプリケーションをhttp://127.0.0.1:5001/
で実行することができます。
これで、小さなFlaskWebアプリケーションができました。 アプリケーションを実行し、Webブラウザに情報を表示しました。 次に、ルートと、ルートを使用して複数のWebページを提供する方法について学習します。
ステップ4—ルートとビュー機能
このステップでは、アプリケーションにいくつかのルートを追加して、要求されたURLに応じて異なるページを表示します。 また、ビュー機能とその使用方法についても学習します。
route は、ユーザーがブラウザーでWebアプリケーションにアクセスしたときに受け取るものを判別するために使用できるURLです。 たとえば、http://127.0.0.1:5000/
は、インデックスページを表示するために使用される可能性のあるメインルートです。 URL http://127.0.0.1:5000/about
は、訪問者にWebアプリケーションに関する情報を提供するaboutページに使用される別のルートである可能性があります。 同様に、ユーザーがhttp://127.0.0.1:5000/login
でアプリケーションにサインインできるルートを作成できます。
現在、Flaskアプリケーションには、メインURL(http://127.0.0.1:5000/
)を要求するユーザーにサービスを提供するルートが1つあります。 アプリケーションに新しいWebページを追加する方法を示すために、アプリケーションファイルを編集して、http://127.0.0.1:5000/about
でWebアプリケーションに関する情報を提供する別のルートを追加します。
まず、app.py
ファイルを開いて編集します。
nano app.py
ファイルの最後に次の強調表示されたコードを追加して、ファイルを編集します。
フラスコ_app/app.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return '<h1>Hello, World!</h1>' @app.route('/about/') def about(): return '<h3>This is a Flask web application.</h3>'
ファイルを保存して閉じます。
about()
という新しい関数を追加しました。 この関数は、http://127.0.0.1:5000/about
エンドポイントのリクエストを処理するview関数に変換する@app.route()
デコレータで装飾されています。
開発サーバーが実行されている状態で、ブラウザーを使用して次のURLにアクセスします。
http://127.0.0.1:5000/about
<h3>
HTML見出しにレンダリングされたテキストThis is a Flask web application.
が表示されます。
1つのビュー機能に複数のルートを使用することもできます。 たとえば、/
と/index/
の両方でインデックスページを提供できます。 これを行うには、app.py
ファイルを開いて編集します。
nano app.py
hello()
ビュー関数に別のデコレータを追加して、ファイルを編集します。
フラスコ_app/app.py
from flask import Flask app = Flask(__name__) @app.route('/') @app.route('/index/') def hello(): return '<h1>Hello, World!</h1>' @app.route('/about/') def about(): return '<h3>This is a Flask web application.</h3>'
ファイルを保存して閉じます。
この新しいデコレータを追加すると、http://127.0.0.1:5000/
とhttp://127.0.0.1:5000/index
の両方でインデックスページにアクセスできます。
これで、ルートとは何か、それらを使用してビュー機能を作成する方法、およびアプリケーションに新しいルートを追加する方法を理解できました。 次に、動的ルートを使用して、ユーザーがアプリケーションの応答を制御できるようにします。
ステップ5—動的ルート
このステップでは、動的ルートを使用して、ユーザーがアプリケーションを操作できるようにします。 URLを通過した単語を大文字にするルートと、2つの数字を足して結果を表示するルートを作成します。
通常、ユーザーはURLを手動で編集してWebアプリケーションを操作することはありません。 むしろ、ユーザーは、ユーザーの入力とアクションに応じて異なるURLにつながるページ上の要素を操作しますが、このチュートリアルの目的のために、URLを編集して、アプリケーションが異なるURLで異なる応答をする方法を示します。
まず、app.py
ファイルを開いて編集します。
nano app.py
次の編集で行うように、URLの値など、ユーザーがWebアプリケーションに何かを送信できるようにする場合は、アプリが信頼できないデータ(ユーザーのデータ)を直接表示しないように常に注意する必要があります。送信)。 ユーザーデータを安全に表示するために、Flaskと一緒にインストールされたmarkupsafe
パッケージに付属のescape()
機能を使用してください。
app.py
を編集し、ファイルの先頭のFlask
インポートの上に次の行を追加します。
フラスコ_app/app.py
from markupsafe import escape from flask import Flask # ...
次に、ファイルの最後に次のルートを追加します。
フラスコ_app/app.py
# ... @app.route('/capitalize/<word>/') def capitalize(word): return '<h1>{}</h1>'.format(escape(word.capitalize()))
ファイルを保存して閉じます。
この新しいルートには、可変セクション<word>
があります。 これにより、FlaskはURLから値を取得し、それをビュー関数に渡すように指示されます。 URL変数<word>
は、キーワード引数をcapitalize()
ビュー関数に渡します。 引数の名前はURL変数(この場合はword
)と同じです。 これにより、URLを介して渡された単語にアクセスし、Pythonのcapitalize()
メソッドを使用して大文字のバージョンで応答できます。
以前にインポートしたescape()
関数を使用して、word
文字列をテキストとしてレンダリングします。 これは、クロスサイトスクリプティング(XSS)攻撃を回避するために重要です。 ユーザーが単語の代わりに悪意のあるJavaScriptを送信すると、escape()
はテキストとしてレンダリングされ、ブラウザーはそれを実行しないため、Webアプリケーションを安全に保つことができます。
<h1>
HTML見出し内に大文字の単語を表示するには、format()
Pythonメソッドを使用します。このメソッドの詳細については、 Python3で文字列フォーマッターを使用する方法を参照してください。
開発サーバーが実行されている状態で、ブラウザーを開き、次のURLにアクセスします。 ハイライトされた単語は、任意の単語に置き換えることができます。
http://127.0.0.1:5000/capitalize/hello http://127.0.0.1:5000/capitalize/flask http://127.0.0.1:5000/capitalize/python
ページの<h1>
タグで大文字になっているURLの単語を確認できます。
ルートで複数の変数を使用することもできます。 これを示すために、2つの正の整数を加算して結果を表示するルートを追加します。
app.py
ファイルを開いて編集します。
nano app.py
次のルートをファイルの最後に追加します。
フラスコ_app/app.py
# ... @app.route('/add/<int:n1>/<int:n2>/') def add(n1, n2): return '<h1>{}</h1>'.format(n1 + n2)
ファイルを保存して閉じます。
このルートでは、特殊コンバーター int
を、正の整数のみを受け入れるURL変数(/add/<int:n1>/<int:n2>/
)とともに使用します。 デフォルトでは、URL変数は文字列と見なされ、そのように扱われます。
開発サーバーが実行されている状態で、ブラウザーを開き、次のURLにアクセスします。
http://127.0.0.1:5000/add/5/5/
結果は、2つの数値の合計になります(この場合は10
)。
これで、動的ルートを使用して、要求されたURLに応じて単一のルートにさまざまな応答を表示する方法を理解できました。 次に、エラーが発生した場合にFlaskアプリケーションのトラブルシューティングとデバッグを行う方法を学習します。
ステップ6—Flaskアプリケーションのデバッグ
Webアプリケーションを開発するとき、アプリケーションが期待する動作ではなくエラーを表示する状況に頻繁に遭遇します。 変数のスペルを間違えたり、関数の定義やインポートを忘れたりする可能性があります。 これらの問題の修正を容易にするために、Flaskは、アプリケーションを開発モードで実行するときにデバッガーを提供します。 このステップでは、Flaskデバッガーを使用してアプリケーションのエラーを修正する方法を学習します。
エラーの処理方法を示すために、ユーザー名のリストからユーザーに挨拶するルートを作成します。
app.py
ファイルを開いて編集します。
nano app.py
次のルートをファイルの最後に追加します。
フラスコ_app/app.py
# ... @app.route('/users/<int:user_id>/') def greet_user(user_id): users = ['Bob', 'Jane', 'Adam'] return '<h2>Hi {}</h2>'.format(users[user_id])
ファイルを保存して閉じます。
上記のルートでは、greet_user()
ビュー関数はuser_id
URL変数からuser_id
引数を受け取ります。 int
コンバーターを使用して、正の整数を受け入れます。 関数内には、users
というPythonリストがあり、ユーザー名を表す3つの文字列が含まれています。 view関数は、提供されたuser_id
に応じて作成された文字列を返します。 user_id
が0
の場合、Bob
がリストの最初の項目であるため、応答は<h2>
タグのHi Bob
になります( users[0]
の値)。
開発サーバーが実行されている状態で、ブラウザーを開き、次のURLにアクセスします。
http://127.0.0.1:5000/users/0 http://127.0.0.1:5000/users/1 http://127.0.0.1:5000/users/2
次の応答が返されます。
OutputHi Bob Hi Jane Hi Adam
これは今のところうまく機能しますが、存在しないユーザーに挨拶を要求するとうまくいかない可能性があります。 Flaskデバッガーがどのように機能するかを示すには、次のURLにアクセスしてください。
http://127.0.0.1:5000/users/3
次のようなページが表示されます。
上部のページには、Python例外の名前が表示されます。これは IndexError で、リストインデックス(この場合は3
)であることを示します。リストには3つの項目しかないため、0
から2
までのみ)。 デバッガーでは、この例外を発生させたコード行を示すトレースバックを確認できます。
トレースバックの最後の2行は、通常、エラーの原因を示しています。 あなたの場合、行は次のようになります。
File "/home/USER/flask_app/app.py", line 28, in greet_user return '<h2>Hi {}</h2>'.format(users[user_id])
これは、エラーがapp.py
ファイル内のgreet_user()
関数、特にreturn
行で発生していることを示しています。
例外を発生させる元の行を知っていると、コードで何がうまくいかなかったかを判断し、それを修正するために何をすべきかを判断するのに役立ちます。
この場合、単純なtry...except
句を使用してこのエラーを修正できます。 要求されたURLにリストの範囲外のインデックスがある場合、ユーザーは 404 Not Found エラーを受け取ります。これは、探しているページが存在しないことをユーザーに通知するHTTPエラーです。
app.py
ファイルを開いて編集します。
nano app.py
HTTP 404エラーで応答するには、Flaskの abort()関数が必要です。この関数を使用してHTTPエラー応答を行うことができます。 ファイルの2行目を変更して、この関数もインポートします。
フラスコ_app/app.py
from markupsafe import escape from flask import Flask, abort
次に、greet_user()
ビュー関数を次のように編集します。
フラスコ_app/app.py
# ... @app.route('/users/<int:user_id>/') def greet_user(user_id): users = ['Bob', 'Jane', 'Adam'] try: return '<h2>Hi {}</h2>'.format(users[user_id]) except IndexError: abort(404)
上記のtry
を使用して、return
式のエラーをテストします。 エラーがなかった場合、つまりuser_id
の値がusers
リストのインデックスと一致する場合、アプリケーションは適切な挨拶で応答します。 user_id
の値がリストの範囲外の場合、IndexError
例外が発生し、except
を使用してエラーをキャッチし、 abort()
フラスコヘルパー機能。
ここで、開発サーバーが実行されている状態で、URLに再度アクセスします。
http://127.0.0.1:5000/users/3
今回は、ページが存在しないことをユーザーに通知する標準の404エラーページが表示されます。
このチュートリアルを終了すると、app.py
ファイルは次のようになります。
フラスコ_app/app.py
from markupsafe import escape from flask import Flask, abort app = Flask(__name__) @app.route('/') @app.route('/index/') def hello(): return '<h1>Hello, World!</h1>' @app.route('/about/') def about(): return '<h3>This is a Flask web application.</h3>' @app.route('/capitalize/<word>/') def capitalize(word): return '<h1>{}</h1>'.format(escape(word.capitalize())) @app.route('/add/<int:n1>/<int:n2>/') def add(n1, n2): return '<h1>{}</h1>'.format(n1 + n2) @app.route('/users/<int:user_id>/') def greet_user(user_id): users = ['Bob', 'Jane', 'Adam'] try: return '<h2>Hi {}</h2>'.format(users[user_id]) except IndexError: abort(404)
これで、Flaskデバッガーを使用してエラーのトラブルシューティングを行い、エラーを修正するための適切なアクションを決定するのに役立つ一般的なアイデアが得られました。
結論
これで、Flaskとは何か、インストール方法、Webアプリケーションの作成方法、開発サーバーの実行方法、ルートと表示機能を使用して特定のサービスを提供するさまざまなWebページを表示する方法について一般的に理解できました。目的。 また、動的ルートを使用して、ユーザーがURLを介してWebアプリケーションと対話できるようにする方法、およびデバッガーを使用してエラーのトラブルシューティングを行う方法についても学習しました。
Flaskの詳細については、Flaskトピックページをご覧ください。