Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【python】Flaskを使ってAPIサーバを公開する

Flaskとは

Flaskとは、pythonのWebフレームワークです。 軽量なWebフレームワークであり、小さく使い始めることができるのが特徴です。 公式でも"microframework"と銘打っています。

Welcome | Flask (A Python Microframework)

同じpythonフレームワークとしてはDjangoやも挙げられますが、Djangoフルスタックなフレームワークなので、規模が大きめのWebアプリケーション作成に向いている気がします。

Usage

例によってpipでインストールできます。

$ pip install Flask

Anacondaで管理したい人はcondaでも良いでしょう。

$ conda install -c anaconda flask 

Source & Demo

Hello, World!

まずは Hello World から!

# hello.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

サーバを立ち上げてみましょう。

$ FLASK_APP=hello.py flask run

ローカルサーバーが立ち上がるので、ブラウザで開くとHello, Worldが表示されるのがわかります。

f:id:rennnosukesann:20180721150306p:plain

またアプリの実行はスクリプト上でも行うことができます。

# hello.py
from flask import Flask
app = Flask(__name__)
app.run(host="127.0.0.1", port=5000)
$ python hello.py

APIの定義

次はAPIを提供してみましょう。
FlaskではAPIの定義も簡単に行なえます。

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

@app.route("/hoge", methods=['GET'])
def getHoge():
    # URLパラメータ
    params = request.args
    response = {}
    if 'param' in params:
        response.setdefault('res', 'param is : ' + params.get('param'))
    return make_response(jsonify(response))

@app.route("/hoge", methods=['POST'])
def postHoge():
    # ボディ(application/json)パラメータ
    params = request.json
    response = {}
    if 'param' in params:
        response.setdefault('res', 'param is : ' + params.get('param'))
    return make_response(jsonify(response))

app.run(host="127.0.0.1", port=5000)

@app.routeデコレータの引数にパス・メソッド種別を指定しています。
Hello Worldのときはtext/plainを返していましたが、今回はapplication/jsonJSON形式)でレスポンスを返しています。レスポンスをJSONにするには、jsonify関数を使って作成したJSON型データをmake_response関数の引数に渡し、それをAPI関数の返り値とします。

make_responseはレスポンスヘッダ及びレスポンスボディの情報を持つオブジェクトを作成します。このオブジェクトを介して、リクエストヘッダやボディの編集を行うことができます。

body = { "param" : "hoge"}
response = make_response(jsonify(body))
response.headers['X-HogeHoge'] = 'hoge...' # 新しいヘッダ属性を追加

指定したパスに対してリクエストを投げると、結果が確認できます。

http://127.0.0.1:5000/hoge?param=helloAPI(GET)
Response

f:id:rennnosukesann:20180721155155p:plain

http://127.0.0.1:5000/hoge(POST)
Body

f:id:rennnosukesann:20180721155310p:plain

Response

f:id:rennnosukesann:20180721155317p:plain

参照

http://flask.pocoo.org/