Visual Studio Code での Flask チュートリアル
Flask は、URLルーティングとページレンダリングの基本機能を提供する、Webアプリケーション向けの軽量Pythonフレームワークです。
Flask は、フォーム検証、データベース抽象化、認証などの機能を直接提供しないため、「マイクロ」フレームワークと呼ばれています。これらの機能は、代わりに Flask 拡張機能と呼ばれる特別な Python パッケージによって提供されます。これらの拡張機能は Flask とシームレスに統合され、まるで Flask 自体の一部であるかのように機能します。例えば、Flask はページテンプレートエンジンを提供しませんが、Flask のインストールには Jinja テンプレートエンジンがデフォルトで含まれています。便宜上、これらのデフォルト機能を Flask の一部として扱うことが一般的です。
この Flask チュートリアルでは、共通のベーステンプレートを使用する3つのページを持つシンプルな Flask アプリを作成します。その過程で、ターミナル、エディター、デバッガー、コードスニペットなど、Visual Studio Code のいくつかの機能を体験します。
この Flask チュートリアルの完成したコードプロジェクトは GitHub で見つけることができます: python-sample-vscode-flask-tutorial。
問題が発生した場合は、Python 拡張機能 Discussions Q&A で回答を検索したり、質問したりできます。
前提条件
この Flask チュートリアルを正常に完了するには、以下を実行する必要があります (一般的な Python チュートリアルと同じ手順です)。
-
Python 拡張機能をインストールします。
-
Python 3 のバージョン (このチュートリアルは Python 3 用に書かれています) をインストールします。オプションは次のとおりです。
- (すべてのオペレーティングシステム) python.org からダウンロードします。通常、ページに最初に表示される Download ボタンを使用します。
- (Linux) 組み込みの Python 3 インストールで問題ありませんが、他の Python パッケージをインストールするには、ターミナルで
sudo apt install python3-pip
を実行する必要があります。 - (macOS) macOS で Homebrew を使用して
brew install python3
でインストールします。 - (すべてのオペレーティングシステム) Anaconda からダウンロードします (データサイエンス目的の場合)。
-
Windows では、Python インタープリターの場所が PATH 環境変数に含まれていることを確認してください。コマンドプロンプトで
path
を実行して場所を確認できます。Python インタープリターのフォルダーが含まれていない場合は、Windows の設定を開き、「環境」を検索し、アカウントの環境変数を編集 を選択し、Path 変数を編集してそのフォルダーを含めます。
Flask チュートリアル用のプロジェクト環境を作成する
このセクションでは、Flask がインストールされる仮想環境を作成します。仮想環境を使用することで、Flask をグローバルな Python 環境にインストールすることを避け、アプリケーションで使用されるライブラリを正確に制御できます。
-
ファイルシステム上に、このチュートリアル用のフォルダー (例:
hello_flask
) を作成します。 -
VS Code でこのフォルダーを開くには、ターミナルでそのフォルダーに移動して
code .
を実行するか、VS Code を起動して ファイル > フォルダーを開く コマンドを使用します。 -
VS Code で、コマンドパレットを開きます (表示 > コマンドパレット または (⇧⌘P (Windows, Linux Ctrl+Shift+P)))。次に、Python: 環境の作成 コマンドを選択して、ワークスペースに仮想環境を作成します。
venv
と、作成に使用したい Python 環境を選択します。注: 環境を手動で作成したい場合、または環境作成プロセスでエラーが発生した場合は、環境のページを参照してください。
-
仮想環境の作成が完了したら、コマンドパレットから ターミナル: 新しいターミナルを作成 (⌃⇧` (Windows, Linux Ctrl+Shift+`))) を実行します。これによりターミナルが作成され、アクティベーションスクリプトの実行によって仮想環境が自動的にアクティブ化されます。
注: Windows で、既定のターミナルタイプが PowerShell の場合、システムでスクリプトの実行が無効になっているため、activate.ps1 を実行できないというエラーが表示されることがあります。このエラーには、スクリプトを許可する方法に関する情報へのリンクが提供されます。それ以外の場合は、代わりに「コマンドプロンプト」または「Git Bash」を既定に設定するには、ターミナル: 既定のプロファイルを選択 を使用します。
-
VS Code のターミナルで次のコマンドを実行して、仮想環境に Flask をインストールします。
python -m pip install flask
これで、Flask コードを記述するための自己完結型環境の準備ができました。VS Code は ターミナル: 新しいターミナルを作成 を使用すると自動的に環境をアクティブ化します。別のコマンドプロンプトまたはターミナルを開く場合は、source .venv/bin/activate
(Linux/macOS) または .venv\Scripts\Activate.ps1
(Windows) を実行して環境をアクティブ化します。コマンドプロンプトの先頭に (.venv) と表示されていれば、環境がアクティブ化されています。
最小限の Flask アプリを作成して実行する
-
VS Code で、メニューから ファイル > 新しいファイル を使用するか、Ctrl+N を押すか、エクスプローラービューの新しいファイルアイコン (下記参照) を使用して、プロジェクトフォルダーに
app.py
という名前の新しいファイルを作成します。 -
app.py
で、Flask をインポートし、Flask オブジェクトのインスタンスを作成するコードを追加します。以下のコードを (コピー&ペーストではなく) 入力すると、VS Code の IntelliSense とオートコンプリート を確認できます。from flask import Flask app = Flask(__name__)
-
app.py
で、コンテンツ (この場合は単純な文字列) を返す関数を追加し、Flask のapp.route
デコレーターを使用して URL ルート/
をその関数にマッピングします。@app.route("/") def home(): return "Hello, Flask!"
ヒント: 同じ関数にマッピングしたいルートの数に応じて、複数のデコレーターを1行に1つずつ使用できます。
-
app.py
ファイルを保存します (⌘S (Windows, Linux Ctrl+S))。 -
統合ターミナルで
python -m flask run
と入力してアプリを実行します。これにより Flask 開発サーバーが起動します。開発サーバーはデフォルトでapp.py
を探します。Flask を実行すると、次のような出力が表示されるはずです。(.venv) D:\py\\hello_flask>python -m flask run * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Flask モジュールが見つからないというエラーが表示された場合は、前のセクションの最後に説明したように、仮想環境で
python -m pip install flask
を実行したことを確認してください。また、開発サーバーを別の IP アドレスまたはポートで実行したい場合は、
--host=0.0.0.0 --port=80
のようにホストとポートのコマンドライン引数を使用します。 -
レンダリングされたページを既定のブラウザーで開くには、ターミナルで
http://127.0.0.1:5000/
の URL を Ctrl+クリックします。 -
/
のような URL にアクセスすると、デバッグターミナルに HTTP リクエストを示すメッセージが表示されることを確認してください。127.0.0.1 - - [11/Jul/2018 08:40:15] "GET / HTTP/1.1" 200 -
-
ターミナルで Ctrl+C を使用してアプリを停止します。
ヒント:
app.py
以外のファイル名 (例:webapp.py
) を使用する場合は、FLASK_APP という環境変数を定義し、その値を希望するファイルに設定する必要があります。これにより、Flask の開発サーバーは、デフォルトのapp.py
ファイルではなく、FLASK_APP の値を使用します。詳細については、Flask コマンドラインインターフェイスを参照してください。
デバッガーでアプリを実行する
デバッグにより、実行中のプログラムを特定のコード行で一時停止できます。プログラムが一時停止すると、変数の検査、デバッグコンソールパネルでのコード実行、その他 デバッグ に記載されている機能を利用できます。デバッガーを実行すると、デバッグセッションが開始される前に、変更されたファイルも自動的に保存されます。
開始する前に: 前のセクションの最後に、ターミナルで Ctrl+C を使用して実行中のアプリを停止したことを確認してください。1つのターミナルでアプリを実行したままにしておくと、そのポートを占有し続けます。その結果、同じポートを使用してデバッガーでアプリを実行しても、元の実行中のアプリがすべてのリクエストを処理するため、デバッグ中のアプリでアクティビティが表示されず、プログラムがブレークポイントで停止しません。つまり、デバッガーが機能していないように見える場合は、他のアプリインスタンスがまだ実行されていないことを確認してください。
-
app.py
の内容を次のコードに置き換えます。これにより、デバッガーでステップ実行できる2番目のルートと関数が追加されます。import re from datetime import datetime from flask import Flask app = Flask(__name__) @app.route("/") def home(): return "Hello, Flask!" @app.route("/hello/<name>") def hello_there(name): now = datetime.now() formatted_now = now.strftime("%A, %d %B, %Y at %X") # Filter the name argument to letters only using regular expressions. URL arguments # can contain arbitrary text, so we restrict to safe characters only. match_object = re.match("[a-zA-Z]+", name) if match_object: clean_name = match_object.group(0) else: clean_name = "Friend" content = "Hello there, " + clean_name + "! It's " + formatted_now return content
新しい URL ルート
/hello/<name>
に使用されるデコレーターは、追加の任意の値を受け入れることができるエンドポイント /hello/ を定義します。ルート内の<
と>
の中の識別子は、関数に渡され、コードで使用できる変数を定義します。URL ルートは大文字と小文字を区別します。たとえば、ルート
/hello/<name>
は/Hello/<name>
とは異なります。同じ関数で両方を処理したい場合は、各バリアントにデコレーターを使用します。コードコメントに記載されているように、アプリへの様々な攻撃を避けるため、ユーザーが提供する任意の情報は常にフィルタリングしてください。この場合、コードは name 引数を文字のみを含むようにフィルタリングし、制御文字や HTML などのインジェクションを防ぎます。(次のセクションでテンプレートを使用する場合、Flask は自動フィルタリングを行うため、このコードは不要になります。)
-
hello_there
関数の最初のコード行 (now = datetime.now()
) にブレークポイントを設定するには、以下のいずれかを実行します。- その行にカーソルを置いて F9 を押すか、
- その行にカーソルを置いて、メニューから 実行 > ブレークポイントの切り替え コマンドを選択するか、
- 行番号の左側の余白を直接クリックします (そこにカーソルを合わせると、薄い赤い点が表示されます)。
ブレークポイントは左余白に赤い点として表示されます。
-
VS Code の 実行とデバッグ ビューに切り替えます (左側のアクティビティバーまたは ⇧⌘D (Windows, Linux Ctrl+Shift+D) を使用)。"実行とデバッグをカスタマイズするには launch.json ファイルを作成してください" というメッセージが表示される場合があります。これは、まだデバッグ設定を含む
launch.json
ファイルがないことを意味します。launch.json ファイルを作成 リンクをクリックすると、VS Code がファイルを作成できます。 -
リンクを選択すると、VS Code はデバッグ設定の入力を求めます。ドロップダウンから Flask を選択すると、VS Code は Flask 実行設定を含む新しい
launch.json
ファイルを作成します。launch.json
ファイルには多数のデバッグ設定が含まれており、それぞれがconfiguration
配列内の個別の JSON オブジェクトです。 -
「Python: Flask」という名前の設定までスクロールして確認します。この設定には
"module": "flask",
が含まれており、これによりデバッガーが起動するときに VS Code に-m flask
を使用して Python を実行するように指示します。また、env
プロパティで FLASK_APP 環境変数を定義し、デフォルトでapp.py
である起動ファイルを識別しますが、別のファイルを簡単に指定することもできます。ホストやポートを変更したい場合は、args
配列を使用できます。{ "name": "Python Debugger: Flask", "type": "debugpy", "request": "launch", "module": "flask", "env": { "FLASK_APP": "app.py", "FLASK_DEBUG": "1" }, "args": [ "run", "--no-debugger", "--no-reload" ], "jinja": true, "justMyCode": true },
注: 設定の
env
エントリに"FLASK_APP": "${workspaceFolder}/app.py"
が含まれている場合は、上記のように"FLASK_APP": "app.py"
に変更してください。そうしないと、「Cannot import module C」(C はプロジェクトフォルダーがあるドライブ文字) のようなエラーメッセージが表示される場合があります。注:
launch.json
が作成されると、エディターに 構成の追加 ボタンが表示されます。このボタンは、構成リストの先頭に追加する追加の構成のリストを表示します。(実行 > 構成の追加 メニューコマンドも同じアクションを実行します。) -
launch.json
を保存します (⌘S (Windows, Linux Ctrl+S))。デバッグ構成のドロップダウンリストで Python: Flask 構成を選択します。 -
デバッガーを開始するには、実行 > デバッグの開始 メニューコマンドを選択するか、リストの横にある緑色の デバッグの開始 矢印 (F5) を選択します。
ステータスバーの色がデバッグ中を示すように変わることを確認してください。
デバッグツールバー (下記参照) も VS Code に表示され、以下の順序でコマンドが含まれています: 一時停止 (または続行, F5)、ステップオーバー (F10)、ステップイン (F11)、ステップアウト (⇧F11 (Windows, Linux Shift+F11))、再起動 (⇧⌘F5 (Windows, Linux Ctrl+Shift+F5))、停止 (⇧F5 (Windows, Linux Shift+F5))。各コマンドの説明については、VS Code のデバッグ を参照してください。
-
出力は「Python デバッグコンソール」ターミナルに表示されます。そのターミナルで
http://127.0.0.1:5000/
リンクを Ctrl+クリック すると、その URL をブラウザーで開きます。ブラウザーのアドレスバーでhttp://127.0.0.1:5000/hello/VSCode
に移動します。ページがレンダリングされる前に、VS Code は設定したブレークポイントでプログラムを一時停止します。ブレークポイント上の小さな黄色い矢印は、次に実行されるコード行であることを示します。 -
ステップオーバーを使用して
now = datetime.now()
ステートメントを実行します。 -
VS Code ウィンドウの左側には、
now
などのローカル変数やname
などの引数を表示する 変数 ペインがあります。その下には、ウォッチ、呼び出し履歴、ブレークポイント のペインがあります (VS Code のデバッグ で詳細を参照)。ローカル セクションで、異なる値を展開してみてください。値をダブルクリック (または Enter (Windows, Linux F2) を使用) して変更することもできます。ただし、now
のような変数を変更すると、プログラムが壊れる可能性があります。開発者は通常、コードが最初から正しい値を生成しなかった場合にのみ、値を修正するために変更を行います。 -
プログラムが一時停止しているとき、デバッグコンソール パネル (ターミナルパネルの「Python デバッグコンソール」とは異なります) を使用すると、現在のプログラムの状態を使用して式を試したり、コードの一部をテストしたりできます。例えば、
now = datetime.now()
の行をステップオーバーした後、異なる日付/時刻形式を試すことができます。エディターで、now.strftime("%A, %d %B, %Y at %X")
を読み取るコードを選択し、右クリックして デバッグコンソールで評価 を選択すると、そのコードがデバッグコンソールに送られ、そこで実行されます。now.strftime("%A, %d %B, %Y at %X") 'Wednesday, 31 October, 2018 at 18:13:39'
ヒント: デバッグコンソール には、ターミナルに表示されないアプリ内からの例外も表示されます。たとえば、実行とデバッグ ビューの 呼び出し履歴 エリアに「Paused on exception」メッセージが表示された場合、デバッグコンソール に切り替えて例外メッセージを確認してください。
-
その行をデバッグコンソール下部の > プロンプトにコピーし、書式設定を変更してみてください。
now.strftime("%a, %d %B, %Y at %X") 'Wed, 31 October, 2018 at 18:13:39' now.strftime("%a, %d %b, %Y at %X") 'Wed, 31 Oct, 2018 at 18:13:39' now.strftime("%a, %d %b, %y at %X") 'Wed, 31 Oct, 18 at 18:13:39'
-
必要であれば、さらに数行のコードをステップ実行し、続行 (F5) を選択してプログラムを実行させます。ブラウザーウィンドウに結果が表示されます。
-
コードの行を別の datetime 形式 (例:
now.strftime("%a, %d %b, %y at %X")
) を使用するように変更し、ファイルを保存します。Flask サーバーは自動的にリロードされるため、デバッガーを再起動する必要なく変更が適用されます。ブラウザーでページを更新して更新を確認します。 -
完了したらブラウザーを閉じ、デバッガーを停止します。デバッガーを停止するには、停止ツールバーボタン (赤い四角) または 実行 > デバッグの停止 コマンド (⇧F5 (Windows, Linux Shift+F5)) を使用します。
ヒント:
http://127.0.0.1:5000/hello/VSCode
のような特定の URL に繰り返し移動しやすくするには、
定義へ移動 と 定義をピーク コマンド
Flask やその他のライブラリを操作していると、それらのライブラリ自体のコードを調べたくなることがあります。VS Code には、任意のコード内のクラスやその他のオブジェクトの定義に直接移動できる便利なコマンドが2つあります。
-
定義へ移動 は、あなたのコードからオブジェクトを定義するコードにジャンプします。例えば、
app.py
でFlask
クラス (app = Flask(__name__)
の行) を右クリックし、定義へ移動 を選択すると (F12 を使用することもできます)、Flask ライブラリ内のクラス定義に移動します。 -
定義をピーク (⌥F12 (Windows Alt+F12, Linux Ctrl+Shift+F10)、右クリックのコンテキストメニューにもあります) は類似していますが、クラス定義をエディター内に直接表示します (コードを隠さないようにエディターウィンドウにスペースを作成します)。ピークウィンドウを閉じるには Escape を押すか、右上隅の x を使用します。
テンプレートを使用してページをレンダリングする
このチュートリアルでこれまで作成したアプリは、Python コードからプレーンテキストのウェブページのみを生成します。HTML をコード内で直接生成することも可能ですが、開発者はそのような方法を避けます。なぜなら、それがアプリを クロスサイトスクリプティング (XSS) 攻撃 にさらす可能性があるからです。例えば、このチュートリアルの hello_there
関数では、出力コードを content = "<h1>Hello there, " + clean_name + "!</h1>"
のように書式設定することを考えるかもしれませんが、ここで content
の結果がブラウザーに直接渡されます。この方法は、攻撃者が悪意のある HTML (JavaScript コードを含む) を clean_name
に最終的に含まれる URL に配置し、それがブラウザーで実行されることを可能にします。
はるかに良い方法は、テンプレート を使用して HTML をコードから完全に分離することです。これにより、コードはデータ値のみに関心を持ち、レンダリングには関心を持たなくなります。
- テンプレートは、コードが実行時に提供する値のプレースホルダーを含む HTML ファイルです。テンプレートエンジンは、ページのレンダリング時に置換処理を行います。したがって、コードはデータ値のみに関心を持ち、テンプレートはマークアップのみに関心を持つことになります。
- Flask のデフォルトのテンプレートエンジンは Jinja であり、Flask をインストールすると自動的にインストールされます。このエンジンは、自動エスケープ (XSS 攻撃を防ぐため) やテンプレート継承など、柔軟なオプションを提供します。継承を使用すると、共通のマークアップを持つベースページを定義し、そのベースの上にページ固有の追加機能を構築できます。
このセクションでは、テンプレートを使用して単一のページを作成します。続くセクションでは、静的ファイルを配信するようにアプリを設定し、その後、それぞれがベーステンプレートからのナビゲーションバーを含む複数のページをアプリに追加します。
-
hello_flask
フォルダー内に、templates
という名前のフォルダーを作成します。これは、Flask がデフォルトでテンプレートを探す場所です。 -
templates
フォルダー内に、以下の内容でhello_there.html
という名前のファイルを作成します。このテンプレートには、「name」と「date」という2つのプレースホルダーが含まれており、これらは波括弧のペア{{
と}}
で区切られています。ご覧のとおり、書式設定コードもテンプレートに直接含めることができます。<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Hello, Flask</title> </head> <body> {%if name %} <strong>Hello there, {{ name }}!</strong> It's {{ date.strftime("%A, %d %B, %Y at %X") }}. {% else %} What's your name? Provide it after /hello/ in the URL. {% endif %} </body> </html>
ヒント: Flask 開発者は、
strftime
の代わりに flask-babel 拡張機能を使用して日付の書式設定を行うことがよくあります。これは flask-babel がロケールとタイムゾーンを考慮に入れるためです。 -
app.py
のファイル上部に、Flask のrender_template
関数をインポートします。from flask import render_template
-
app.py
でも、hello_there
関数を修正してrender_template
を使用し、テンプレートをロードして名前付きの値を適用します (また、名前がない場合を認識するルートも追加します)。render_template
は、最初の引数がtemplates
フォルダーに対する相対パスであると仮定します。通常、開発者はテンプレートをそれを使用する関数と同じ名前にしますが、コード内で常に正確なファイル名を参照するため、名前を一致させる必要はありません。@app.route("/hello/") @app.route("/hello/<name>") def hello_there(name = None): return render_template( "hello_there.html", name=name, date=datetime.now() )
これでコードがはるかにシンプルになり、マークアップと書式設定はすべてテンプレートに含まれているため、データ値のみに関心を持つようになっていることがわかります。
-
プログラムを起動し (デバッガー内または外部で、⌃F5 (Windows, Linux Ctrl+F5) を使用)、/hello/name URL に移動して結果を確認します。
-
また、
<a%20value%20that%20could%20be%20HTML>
のような名前を使用して /hello/name URL に移動し、Flask の自動エスケープがどのように機能するかを確認してください。「name」の値は、実際の要素としてレンダリングされるのではなく、ブラウザーにプレーンテキストとして表示されます。
静的ファイルを配信する
静的ファイルには2種類あります。1つ目は、ページテンプレートが直接参照できるスタイルシートのようなファイルです。これらのファイルはアプリ内の任意のフォルダーに配置できますが、一般的には static
フォルダー内に置かれます。
2つ目は、コードで処理したいファイル、たとえば静的ファイルを返す API エンドポイントを実装する場合などです。この目的のために、Flask オブジェクトには組み込みメソッド send_static_file
が含まれており、これによりアプリの static
フォルダー内に含まれる静的ファイルを含むレスポンスが生成されます。
以下のセクションでは、両方の種類の静的ファイルについて説明します。
テンプレートで静的ファイルを参照する
-
hello_flask
フォルダー内に、static
という名前のフォルダーを作成します。 -
static
フォルダー内に、以下の内容でsite.css
という名前のファイルを作成します。このコードを入力した後、VS Code が CSS ファイルに対して提供するシンタックスハイライト (カラープレビューを含む) も確認してください。.message { font-weight: 600; color: blue; }
-
templates/hello_there.html
内で、</head>
タグの前に以下の行を追加します。これはスタイルシートへの参照を作成します。<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='site.css')}}" />
ここで使用されている Flask の url_for タグは、ファイルへの適切なパスを作成します。引数として変数を取ることができるため、
url_for
は、必要に応じて生成されるパスをプログラムで制御することを可能にします。 -
また、
templates/hello_there.html
で、<body>
要素の内容を以下のマークアップに置き換えます。これは<strong>
タグの代わりにmessage
スタイルを使用します (そして、名前なしで hello/ URL を使用した場合にもメッセージを表示します)。{%if name %} <span class="message">Hello there, {{ name }}!</span> It's {{ date.strftime("%A, %d %B, %Y at %X") }}. {% else %} <span class="message">What's your name? Provide it after /hello/ in the URL.</span> {% endif %}
-
アプリを実行し、/hello/name URL に移動して、メッセージが青色でレンダリングされることを確認します。完了したらアプリを停止します。
コードから静的ファイルを配信する
-
static
フォルダー内に、以下の内容 (意味のないサンプルデータです) でdata.json
という名前の JSON データファイルを作成します。{ "01": { "note": "This data is very simple because we're demonstrating only the mechanism." } }
-
app.py
で、send_static_file
メソッドを使用して静的データファイルを返すルート /api/data を持つ関数を追加します。@app.route("/api/data") def get_data(): return app.send_static_file("data.json")
-
アプリを実行し、/api/data エンドポイントに移動して、静的ファイルが返されることを確認します。完了したらアプリを停止します。
ベーステンプレートを拡張する複数のテンプレートを作成する
ほとんどの Web アプリケーションには複数のページがあり、それらのページは通常多くの共通要素を共有するため、開発者はそれらの共通要素をベースページテンプレートに分離し、他のページテンプレートがそれを拡張できるようにします (これはテンプレート継承とも呼ばれます)。
また、同じテンプレートを拡張する多くのページを作成することになるため、VS Code で新しいページテンプレートを素早く初期化できるコードスニペットを作成しておくと便利です。スニペットは、面倒でエラーが発生しやすいコピー&ペースト操作を避けるのに役立ちます。
以下のセクションでは、このプロセスの様々な部分について説明します。
ベースページテンプレートとスタイルを作成する
Flask のベースページテンプレートには、CSS ファイルやスクリプトファイルなどへの参照を含む、一連のページの共有部分がすべて含まれています。ベーステンプレートはまた、ベースを拡張する他のテンプレートでオーバーライドされると予想される1つ以上の ブロック タグを定義します。ブロックタグは、ベーステンプレートと拡張テンプレートの両方で {% block <name> %}
と {% endblock %}
で区切られます。
以下の手順でベーステンプレートの作成方法を説明します。
-
templates
フォルダー内に、以下の内容でlayout.html
という名前のファイルを作成します。このファイルには「title」と「content」という名前のブロックが含まれています。ご覧のとおり、マークアップはホーム、アバウト、連絡先ページへのリンクを含むシンプルなナビゲーションバー構造を定義しており、これらは後のセクションで作成します。各リンクは、一致するルートのリンクをランタイムで生成するために、再び Flask のurl_for
タグを使用しています。<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>{% block title %}{% endblock %}</title> <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='site.css')}}" /> </head> <body> <div class="navbar"> <a href="{{ url_for('home') }}" class="navbar-brand">Home</a> <a href="{{ url_for('about') }}" class="navbar-item">About</a> <a href="{{ url_for('contact') }}" class="navbar-item">Contact</a> </div> <div class="body-content"> {% block content %} {% endblock %} <hr/> <footer> <p>© 2018</p> </footer> </div> </body> </html>
-
既存の「message」スタイルの下に、以下のスタイルを
static/site.css
に追加し、ファイルを保存します。このチュートリアルではレスポンシブデザインのデモンストレーションは試みられていないことに注意してください。これらのスタイルは、合理的に興味深い結果を生成するだけです。.navbar { background-color: lightslategray; font-size: 1em; font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; color: white; padding: 8px 5px 8px 5px; } .navbar a { text-decoration: none; color: inherit; } .navbar-brand { font-size: 1.2em; font-weight: 600; } .navbar-item { font-variant: small-caps; margin-left: 30px; } .body-content { padding: 5px; font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
この時点でアプリを実行することもできますが、ベーステンプレートをどこにも使用しておらず、コードファイルを変更していないため、結果は前の手順と同じです。最終的な効果を確認するには、残りのセクションを完了してください。
コードスニペットを作成する
次のセクションで作成する3つのページは layout.html
を拡張するため、ベーステンプレートへの適切な参照を含む新しいテンプレートファイルを初期化するための コードスニペット を作成すると時間を節約できます。コードスニペットは、単一のソースから一貫したコードを提供するため、既存のコードからのコピー&ペースト時に発生しがちなエラーを防ぐことができます。
-
VS Code で、ファイル > 基本設定 > ユーザー スニペットの構成 を選択します。
-
表示されるリストで html を選択します。以前にスニペットを作成したことがある場合は、リストの 既存のスニペット セクションに「html.json」として表示される場合があります。
-
VS Code が
html.json
を開いたら、既存の波括弧内に以下のエントリを追加します (ここには示されていない説明コメントには、$0
行がスニペット挿入後に VS Code がカーソルを配置する場所を示す方法などの詳細が記載されています)。"Flask Tutorial: template extending layout.html": { "prefix": "flextlayout", "body": [ "{% extends \"layout.html\" %}", "{% block title %}", "$0", "{% endblock %}", "{% block content %}", "{% endblock %}" ], "description": "Boilerplate template that extends layout.html" },
-
html.json
ファイルを保存します (⌘S (Windows, Linux Ctrl+S))。 -
これで、
flext
のようなスニペットのプレフィックスを入力し始めると、次のセクションで示すように、VS Code がオートコンプリートオプションとしてスニペットを提供します。また、スニペットの挿入 コマンドを使用して、メニューからスニペットを選択することもできます。
コードスニペット全般の詳細については、スニペットの作成 を参照してください。
コードスニペットを使用してページを追加する
コードスニペットが配置されたので、ホーム、アバウト、連絡先の各ページのテンプレートを素早く作成できます。
-
templates
フォルダー内に、home.html
という名前の新しいファイルを作成します。次に、flext
と入力し始めると、スニペットが補完候補として表示されます。補完を選択すると、スニペットのコードがスニペットの挿入ポイントにカーソルが置かれた状態で表示されます。
-
「title」ブロックの挿入ポイントに
Home
と記述し、「content」ブロックに<p>Visual Studio Code Flask チュートリアルのホームぺージです。</p>
と記述し、ファイルを保存します。これらの行が、拡張ページテンプレートの唯一のユニークな部分です。 -
templates
フォルダーにabout.html
を作成し、スニペットを使用してボイラープレートマークアップを挿入し、「title」ブロックにAbout us
、「content」ブロックに<p>Visual Studio Code Flask チュートリアルのアバウトページです。</p>
をそれぞれ挿入し、ファイルを保存します。 -
前の手順を繰り返し、2つのコンテンツブロックに
Contact us
と<p>Visual Studio Code Flask チュートリアルの連絡先ページです。</p>
を使用してtemplates/contact.html
を作成します。 -
app.py
に、/about/ および /contact/ ルート用の関数を追加し、それぞれのページテンプレートを参照させます。また、home
関数を修正してhome.html
テンプレートを使用するようにします。# Replace the existing home function with the one below @app.route("/") def home(): return render_template("home.html") # New functions @app.route("/about/") def about(): return render_template("about.html") @app.route("/contact/") def contact(): return render_template("contact.html")
アプリを実行する
すべてのページテンプレートが整ったら、app.py
を保存し、アプリを実行して、ブラウザーを開いて結果を確認します。ページ間を移動して、ページテンプレートがベーステンプレートを適切に拡張していることを確認します。
注: 最新の変更が表示されない場合は、キャッシュされたファイルが表示されるのを避けるために、ページのハードリフレッシュが必要になる場合があります。
任意のアクティビティ
以下のセクションでは、Python と Visual Studio Code を使用する際に役立つ可能性のある追加手順について説明します。
環境用の requirements.txt ファイルを作成する
ソース管理やその他の方法でアプリのコードを共有する場合、仮想環境内のすべてのファイルをコピーするのは意味がありません。なぜなら、受け取る側はいつでも自分で環境を再作成できるからです。
したがって、開発者は通常、仮想環境フォルダーをソース管理から除外し、代わりに requirements.txt
ファイルを使用してアプリの依存関係を記述します。
ファイルを手動で作成することもできますが、pip freeze
コマンドを使用して、アクティブ化された環境にインストールされている正確なライブラリに基づいてファイルを生成することもできます。
-
Python: インタープリターの選択 コマンドを使用して選択した環境で、ターミナル: 新しいターミナルを作成 コマンド (⌃⇧` (Windows, Linux Ctrl+Shift+`))) を実行し、その環境がアクティブ化されたターミナルを開きます。
-
ターミナルで
pip freeze > requirements.txt
を実行して、プロジェクトフォルダーにrequirements.txt
ファイルを作成します。
プロジェクトのコピーを受け取った人 (または任意のビルドサーバー) は、pip install -r requirements.txt
コマンドを実行するだけで、元の環境のパッケージを再インストールできます。(ただし、受け取る側は独自の仮想環境を作成する必要があります。)
注:
pip freeze
は、現在使用していないパッケージを含め、現在の環境にインストールされているすべての Python パッケージを一覧表示します。このコマンドは、正確なバージョン番号を持つパッケージも一覧表示しますが、将来的に柔軟性を高めるために範囲に変換することを検討してもよいでしょう。詳細については、pip コマンドのドキュメントにある 要件ファイル を参照してください。
今後の開発をサポートするためにプロジェクトをリファクタリングする
この Flask チュートリアル全体を通して、アプリのコードはすべて単一の app.py
ファイルに含まれています。さらなる開発を可能にし、関心事を分離するために、app.py
の各部分を個別のファイルにリファクタリングすると便利です。
-
プロジェクトフォルダー内に、アプリ用のフォルダー (例:
hello_app
) を作成し、そのファイルをrequirements.txt
や VS Code が設定やデバッグ構成ファイルを保存する.vscode
フォルダーなどの他のプロジェクトレベルのファイルから分離します。 -
static
およびtemplates
フォルダーをhello_app
に移動します。これらのフォルダーには確実にアプリのコードが含まれているためです。 -
hello_app
フォルダーに、ルーティングとビュー関数を含むviews.py
という名前のファイルを作成します。from flask import Flask from flask import render_template from datetime import datetime from . import app @app.route("/") def home(): return render_template("home.html") @app.route("/about/") def about(): return render_template("about.html") @app.route("/contact/") def contact(): return render_template("contact.html") @app.route("/hello/") @app.route("/hello/<name>") def hello_there(name = None): return render_template( "hello_there.html", name=name, date=datetime.now() ) @app.route("/api/data") def get_data(): return app.send_static_file("data.json")
-
hello_app
フォルダーに、以下の内容で__init__.py
というファイルを作成します。import flask app = flask.Flask(__name__)
-
hello_app
フォルダーに、以下の内容でwebapp.py
というファイルを作成します。# Entry point for the application. from . import app # For application discovery by the 'flask' command. from . import views # For import side-effects of setting up routes.
-
デバッグ構成ファイル
launch.json
を開き、起動オブジェクトを指すようにenv
プロパティを次のように更新します。"env": { "FLASK_APP": "hello_app.webapp" },
-
元の
app.py
ファイルは、その内容が他のアプリファイルに移動されたため、プロジェクトルートから削除します。 -
これで、プロジェクトの構造は次のようになります。
-
すべてが機能することを確認するために、デバッガーでアプリを再度実行します。VS Code のデバッガーの外部でアプリを実行するには、ターミナルから以下の手順を使用します。
FLASK_APP
の環境変数を設定します。Linux および macOS ではexport set FLASK_APP=webapp
を使用し、Windows では PowerShell を使用している場合は$env:FLASK_APP=webapp
、コマンドプロンプトを使用している場合はset FLASK_APP=webapp
を使用します。hello_app
フォルダーに移動し、python -m flask run
を使用してプログラムを起動します。
Container Tools 拡張機能を使用して Flask アプリのコンテナーを作成する
Container Tools 拡張機能を使用すると、Visual Studio Code からコンテナー化されたアプリケーションを簡単にビルド、管理、デプロイできます。このチュートリアルで開発された Flask アプリケーション用の Python コンテナーを作成する方法に興味がある場合は、コンテナー内の Python チュートリアルを参照してください。このチュートリアルでは、以下の方法を説明します。
- シンプルな Python コンテナーを記述する
Dockerfile
ファイルを作成する。 - Flask アプリケーションのビルド、実行、機能の検証。
- コンテナーで実行されているアプリをデバッグする。
問題が発生した場合は、Python 拡張機能 Discussions Q&A で回答を検索したり、質問したりできます。
次のステップ
Visual Studio Code で Flask を使用するこのチュートリアルを完了おめでとうございます!
このチュートリアルで完成したコードプロジェクトは GitHub で見つけることができます: python-sample-vscode-flask-tutorial。
このチュートリアルではページテンプレートの表面をなぞったにすぎないため、テンプレートの詳細については Jinja2 ドキュメント を参照してください。Template Designer Documentation にはテンプレート言語に関するすべての詳細が含まれています。また、公式 Flask チュートリアル および Flask の 拡張機能 のドキュメントも確認するとよいでしょう。
本番ウェブサイトでアプリを試すには、チュートリアル Docker コンテナーを使用して Python アプリを Azure App Service にデプロイする を参照してください。Azure はまた、標準コンテナーである Linux 上の App Service も提供しており、VS Code 内からウェブアプリをデプロイできます。
Python に関連する VS Code ドキュメントの以下の記事も確認するとよいでしょう。