Flaskを使ってみる

RESTサーバー

FlaskはWEBサーバーを構築するためのFrameworkですが、RESTサーバーを構築することができます。
RESTサーバはGET POST PUT DELETEのAPIを使います。
単純なRESTサーバーのコードは以下の様になります。
実際にはPUTやDELETEの時に、データの登録や削除を行うことになります。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Simple REST Server

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

@app.route("/get")
#curl --dump-header - http://192.168.10.43:8000/get
def get():
        data = json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
        return data

@app.route("/get2")
#curl --dump-header - http://192.168.10.43:8000/get2
def get2():
        data = json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
        resp = Response(response=data,status=200,mimetype="application/json")
        return resp

#curl -X POST -H "Content-Type: application/json" -d '{"Name":"hogehoge1973", "Age":"100"}' http://192.168.10.43:8000/post
@app.route("/post", methods=["POST"])
def post():
        print("post: request={}".format(request))
        print("post: request.data={}".format(request.data))
        dict = json.loads(request.data)
        print("dict={}".format(dict))
        print("Name={}".format(dict['Name']))
        print("Age={}".format(dict['Age']))
        data = json.dumps(['result', 'ok'])
        return data

#curl -X PUT -H "Content-Type: application/json"  http://192.168.10.43:8000/put/fugafuga/100
@app.route("/put/<name>/<age>", methods=["PUT"])
def put(name=None, age=None):
        print("put: request={}".format(request))
        print("put: name={}".format(name))
        print("put: age={}".format(age))
        data = json.dumps(['result', 'ok'])
        return data

#curl -X DELETE -H "Content-Type: application/json" http://192.168.10.43:8000/delete/gehogeho1926
@app.route("/delete/<name>", methods=["DELETE"])
def delete(name):
        print("delete: request={}".format(request))
        print("delete: name={}".format(name))
        data = json.dumps(['result', 'ok'])
        return data

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

curlコマンドを使ってGETを発行してみます。
一見正しそうですが、curlでHTTPヘッダーを確認するとContent-Typeがtext/htmlになっています。
$ curl --dump-header - http://192.168.10.43:8000/get
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 39
Server: Werkzeug/1.0.1 Python/3.6.9
Date: Wed, 17 Mar 2021 14:21:32 GMT

["foo", {"bar": ["baz", null, 1.0, 2]}]

urlをget2に変えてみます。
Response関数を使ってContent-Typeヘッダーを変更しています。
これでHTTPヘッダーがContent-Type: application/jsonになります。
$ curl --dump-header - http://192.168.10.43:8000/get2
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 39
Server: Werkzeug/1.0.1 Python/3.6.9
Date: Wed, 17 Mar 2021 14:23:01 GMT

["foo", {"bar": ["baz", null, 1.0, 2]}]



curlコマンドを使ってPOSTを発行します。
POSTはデータの追加に使われるので、ユニークキー(プライマリーキー)と値をURLパラメータとして送ります。
$ curl -X POST -H "Content-Type: application/json" -d '{"Name":"hogehoge1973", "Age":"100"}' http://192.168.10.43:8000/post

サーバー側にはPOSTしたデータが表示されます。
post: request=<Request 'http://192.168.10.43:8000/post' [POST]>
post: request.data=b'{"Name":"hogehoge1973", "Age":"100"}'
dict={'Name': 'hogehoge1973', 'Age': '100'}
Name=hogehoge1973
Age=100



curlコマンドを使ってPUTを発行します。
POSTとPUTはよく似ています。その違いは色々なところで紹介されていますが、こちらが分かり易いです。
PUTは既存データの更新に使われます。
ユニークキー(プライマリーキー)の値と、更新するデータをURLパス変数、あるいはURLパラメータのどちらかで送ります。
URLパス変数では、項目名が分からないので、全ての項目を更新することになります。
URLパラメータでは、項目名と値のペアを、更新したい項目だけ送ります。
$ curl -X PUT -H "Content-Type: application/json"  http://192.168.10.43:8000/put/fugafuga/100

サーバー側にはPUTしたデータが表示されます。
put: request=<Request 'http://192.168.10.43:8000/put/fugafuga/100' [PUT]>
put: name=fugafuga
put: age=100



curlコマンドを使ってDELETEを発行します。
DELETEは既存データの削除に使われます。
ユニークキー(プライマリーキー)の値だけ分かればいいので、ユニークキー(プライマリーキー)の値をURLパス変数として送ります。
$ curl -X DELETE -H "Content-Type: application/jso" http://192.168.10.43:8000/delete/gehogeho1926

サーバー側にはDELETEするユニークキー(プライマリーキー)が表示されます。
delete: request=<Request 'http://192.168.10.43:8000/delete/gehogeho1926' [DELETE]>
delete: name=gehogeho1926

続く...