flaskとは
Flaskは、pythonを使ってWebサイトを作る仕組みで、Djangoのような自動作成の部分はありませんが、軽量で使いやすいフレームワークです
くわしくはFlaskの基礎を読んでください
今回は、flaskの基礎でやったことをDockerでもやってみようというものです
Flaskの基礎をDockerで
Flaskで文字列出力
Helloというフォルダーに環境を作ります
Hello compose.yaml Dockerfile app.py
作るのはいつものcompose.yamlとDockerfileとapp.pyです
services:
web:
build: .
environment:
FLASK_ENV: development
ports:
- "5000:5000"
volumes:
- ./:/usr/src/app
webというサービス名でport5000を使います。カレントフォルダーにapp.pyを作ります
FROM python:3.10 WORKDIR /usr/src/app RUN pip install flask==2.3.3 CMD ["flask", "run", "--host=0.0.0.0"]
1回目のupの時にimageを落としますので、少し時間がかかりますが、imageができてしまえば後は早いです
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_flask():
return 'Hello Flask!'
@app.routeでlocalhost:5000/ のトップがリクエストされたらhello_flask()関数が動き、returnで文字を返します。それをHTMLとして出力します
実行するときは Helloフォルダーにコマンドプロンプトで移動して
docker compose up -d
これで動きましたので「localhost:5000」をブラウザで開けばよいです
FlaskでHTMLを呼び出す
次にpythonからindex.htmlを呼び出して出力するサンプルです
HelloHTML
compose.yaml
Dockerfile
app.py
+--templates
index.html
compose.yamlやDockerfileは同じです。違うのはtemplatesというフォルダーを作成して配下にindex.htmlを入れるところとapp.pyでのreturnの仕方です
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
returnのところで render_template関数を使ってindex.htmlの中身を読み込んでいます
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>Hello HTML flask</p>
</body>
</html>
単純にindex.htmlファイルを読み込んで出すだけです
起動は同じupコマンドですが、先のコンテナが稼働中だとportがぶつかるのでdownしてから実行してください
FlaskからデータをHTMLに送る
次にpythonからindex.htmlを呼び出してデータを渡すサンプルです
HelloJinja
compose.yaml
Dockerfile
app.py
+--templates
index.html
compose.yamlやDockerfileは同じです。index.htmlの中のjinjaという記法とapp.pyでのreturnの仕方です
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html',
title="jinja HTML",
h1text="Hello jinja HTML")
returnのところで render_template関数を使ってindex.htmlの中身を読み込んで、名前付きのデータを送り込んでいます
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{title}}</title>
</head>
<body>
<p>{{h1text}}</p>
</body>
</html>
htmlファイル中の{{}}の中に変数名が入ります。そこにわたったデータが出力されます
いままでと同様に前のものをdownしてupすれば動きます