【Flask】render_templateでpyファイルとhtmlファイルを分ける
前回【WSL/Anaconda/Flask】仮想環境の作成とFlaskのインストール、簡単なWebアプリ作成 - よちよちpython のつづき。
今回は、pythonのWebフレームワークFlask
の render_template
モジュールを使って、「pyファイルとWebコンテンツ内容を切り離し、別個にhtmlテンプレートファイルにする方法」です。
内容的には簡単です。直ぐできます。
- pyファイルを書き換える
- htmlファイルを新規作成する
- 実行確認
目次
実行環境
前回【WSL/Anaconda/Flask】仮想環境の作成とFlaskのインストール、簡単なWebアプリ作成 - よちよちpythonはWSL:Ubuntuに入れたAnacondaでやったのですが、 今回はWindows上に直で入れたAnacondaで行います。
- Windows10 Home
- Anaconda 4.11.0
- Python 3.9.7
- VSCode 1.63.2
- 外部ライブラリ
- Flask 2.0.2
- colorama (Windowsユーザーは、No Module エラーが出れば 手動でインストールする。)
バージョン確認はターミナルから以下のコマンドでできます。
# Anacondaのバージョン PS > conda -V # pythonのバージョン PS > python -V # VSCodeのバージョン PS > code --version # pythonライブラリのバージョン確認等、詳細情報 PS > pip show flask
ディレクトリ構成
プロジェクトフォルダ名「flask_app」の中で作業しております。
./flask_app/ └── app.py 0 directories, 1 file
前回作ったpyファイルが1つある。
手順
最初に書いた通り、今回行うことは
- pyファイルを書き換える
- htmlファイルを新規作成する
- 実行確認
pyファイルを書き換える
前回作ったpyファイル内容 (ファイル名 : app.py)
from flask import Flask app = Flask(__name__) @app.route('/') def index(): html_text = """ <h1>Hellow Flask !!</h1> <p>2行目</p> <p>3行目</p> """ return html_text if __name__=='__main__': app.run(debug=True)
実行するには、
(仮想環境名) PS @プロジェクトフォルダ > python app.py
ブラウザのURL窓に「localhost:5000」「127.0.1:5000」「http://127.0.1:5000」のどれかを入力、アクセスするとFlaskのサーバが立ち上がり app.py のindex関数に書いたものがブラウザに表示される。
もっと豪華なページにしたければ上のコードの index関数 のreturn で返している html を豪華に書けばいいのですが、そうするとpyファイルをhtmlが埋め尽くして読みにくくなる。
そこで、pyファイルとhtmlファイルを分けて書きましょう、という方法がとられます。第一、pyファイルにhtmlを書くとVSCodeなんかを使ってる場合は自動入力補完が効きません。分けた方が入力も楽。
py と html を別けるために、app.py ファイルを次のように書き替えます。
# モジュールを追加 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): # 内容を削除 # 書き換え return render_template('index.html') if __name__=='__main__': app.run(debug=True)
【変更点】
- モジュールのインポート : render_templateを追加
- index関数内の html文 を削除
- index関数の return に render_template で index.html を返すよう書き換え
これで「index.html」ファイルをレンダリングするように出来ます。
「ルートディレクトリにアクセスした方には「index.html」を読ませる」
その index.html ファイルを次に作ります。
htmlファイルを新規作成
app.py のindex関数のreturnで返した render_template('index.html') のhtmlファイルを作成します。
htmlテンプレートファイルの保存場所
Flaskでは、htmlファイルの保存場所であるディレクトリ名が「templates」フォルダ と決まっています。頭文字を大文字で「T」と書いたり最後の「s」が抜けてもエラーが出るので間違えないように。
まずはテンプレートファイル保存用ディレクトリを作成
# プロジェクトフォルダ内にtemplates フォルダを作成 (仮想環境名) PS @プロジェクトフォルダ > mkdir templates
templatesフォルダに空のinde.htmlファイルを作成
templatesフォルダの中にindex.htmlを新規作成します。コマンド(PowerShell)で打つなら
# templatesフォルダ内に 空のindex.html を作成 (仮想環境名) PS @プロジェクトフォルダ > New-Item -type file ./templates/index.html
ここまで済んだら、ディレクトリ構成は次のようになっている。
flask_app/ ├── app.py └── templates └── index.html
index.htmlの中身を書く
index.htmlを開いて中身を書いていきます。
<h1>render_templateテスト</h> <p>成功しました!</p>
ファイルを保存し「Ctrl + s」しましょう。
実行
ここまでで、pyファイルとhtmlファイルの切り分けは完了です。動くかどうか確認します。
ターミナルからapp.py を実行します。そしてブラウザで「http://127.0.1:5000」「127.0.1:5000」「localhost:5000」のどれか(全部同じもの)にアクセスして index.html 通りに表示されれば成功です。
ついでなので、VSCodeの右下にある言語モードの選択ボタンで、DjangoやJinjaのTemplateにするとEmmetが効かなくなりますが、設定ファイルを書き換えることで再び効くようになるようです。
参考 :
Flask コーディングメモ - Qiita