Flaskのローカル開発環境を構築してみた

Flaskのローカル開発環境を構築してみた

Clock Icon2019.08.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。プロダクトグループの坂井です。

Pythonのフレームワークの一つであるFlaskを使う機会がありましたので、まずはローカル開発環境をDockerで構築してみました。

作業環境

  • macOS Mojave 10.14.6
  • Docker 19.03.1
  • Docker Compose 1.24.1

Dockerのインストールについては割愛します。

構築するローカル開発環境

  • Python 3.7.4
  • Flask 1.1.1

さっそく構築

Pythonの公式イメージがDocker Hubにありますので、公式イメージを利用してコンテナを作成します。

FROM python:3.7.4

ARG project_directory
WORKDIR $project_directory

RUN pip install flask

6行目で最新バージョン1のFlaskをインストールしています。

version: "3.7"
services:
  web_flask:
    build:
      context: .
      args:
        project_directory: "/projects/"
    ports:
      - "5000:5000"
    volumes:
      - "./sample_project:/projects"
    environment:
      TZ: "Asia/Tokyo"
      FLASK_ENV: "development"
    command: "flask run --host 0.0.0.0 --port 5000"

環境変数にFLASK_ENV: "development"を指定すると、コード変更時のリロードやデバッグ情報が見れるので、開発時は指定しておくことをお勧めします。

Quickstart - Debug Mode

続いて実際に動かすコードを作成します。今回は 公式ページ に記載されているコードを実行してみます。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

これまで準備したファイルを配置します。

[実行ディレクトリ]
├── Dockerfile
├── docker-compose.yml
└── sample_project
    └── app.py

準備ができたら起動します。

docker-compose up -d

動作確認のため、リクエストを投げてみます。ブラウザでhttp://localhost:5000にアクセスしても確認できます。

curl http://localhost:5000
Hello, World!

機能を追加してみる

作成した環境でそのまま実装を進めることができます。app.pyファイルを変更し保存します。

from flask import Flask, request
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

@app.route('/sample', methods=['POST'])
def sample_post():
    return "param1:{}".format(request.form['param1'])

ハイライト部分を追加、変更しました。新たにPOST /sampleを追加しました。 処置としては受け取ったパラメータ(param1)をただ返すだけです。

追加したコードを実行してみます。

curl http://localhost:5000/sample -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "param1=hogehoge"
param1:hogehoge

コンテナとファイルが同期されており、Flaskがコードの変更を検知してリロードしているため、コードを編集して保存するだけで変更が反映されています。便利ですね。

参考


  1. 執筆時点(2019/08/14)の最新バージョン 

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.