📘

Flask基礎

3 min read

環境構築

基礎的なディレクトリ構成
.
├── Dockerfile
└── app.py

Dockerfile

FROM python:3.9-slim

ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

RUN apt-get update
#ディレクトリ構成を見るためのコマンドをインストールする。
RUN apt-get install tree

RUN pip install Flask gunicorn

#CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app

app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'HelloWorld'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8888)

dockerコマンド実行

docker build -t {image名} .
docker run -itd --name {コンテナ名} -v $PWD:/app -p 8888:8888 {イメージ名}

http://localhost:8888
にアクセス。

各項目

パスパラメータ

コード

app.pyに以下を追加。

@app.route('/user/<name>')
def user(name):
    return f'Hello {name}'

実行

クエリパラメータ

コード

importを追加

from flask import Flask, request

app.pyに以下を追加

@app.route('/username')
def username():
    name = request.args.get('name')
    return f'Good Morning {name}'

実行

POST

methodsのPOSTが必要。
(逆にGETでもアクセスできるっぽい)

コード

@app.route('/user/post', methods=['POST'])
def user_post():
    print('post')
    return 'HelloPost'

実行

curl -X POST http://localhost:8888/user/post

テンプレート

ディレクトリ構成を変更する

.
├── Dockerfile
├── app.py
└── templates
    ├── index.html
    └── layout.html

Dockerfileは上のと同じなので省略

  • app.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html', title='develop') 

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8888)
  • layout.html

共通部分

<!doctype html>
<html>
    <head>
        <title>{{ title }}</title>
    </head>
    <body>
    {% block content %}

    {% endblock %}
    </body>
</html>
  • index.html
{% extends "layout.html" %}
{% block content %}
<h1>HelloWorld</h1>
{% endblock %}

POSTパラメータ

コード

from flask import Flask, request, render_template, redirect, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html', title='develop')

@app.route('/form', methods=['GET', 'POST'])
def form():
    if request.method == 'POST':
        print('POST')
        id = request.form['id']
        name = request.form['name']
        print(f'id={id}, name={name}')
        return redirect(url_for('index'))
    return render_template('form.html', title='develop')

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8888)
  • form.html
{% extends "layout.html" %}
{% block content %}
<form method="POST" action="/form">
    <div>
        <span>Id:</span><input type="text" name="id"/>
    </div>
    <div>
        <span>Name:</span><input type="text" name="name"/>
    </div>
    <div>
        <input type="submit" value="送信"/>
    </div>
</form>
{% endblock %}

Discussion

ログインするとコメントできます