はじめに
前回の続きで、EC2上に構築したFlask2でGET/POSTの動作確認の防備録。
REST APIでは必須のJSONの連携もまとめていきます。
GET
####Flask 1.*までの書き方
引数のmethodsを付けないとデフォルトはGETです
@app.route('/')
def index():
return "世界のみなさん、こんにちは"
@app.route('/get1x', methods=["GET"])
def get1x():
return "GETです"
Flask起動
flask run
curlで動作確認
curl http://127.0.0.1:5000/get1x
GETです
####Flask2の新しい書き方
getメソッドが増えた(laravelっぽい書き方?)
@app.get('/get2x')
def get2x():
return "GET2です"
curlで動作確認
curl http://127.0.0.1:5000/get2x
GET2です
####パラメーター
@app.get('/get2x')
def get2x():
return request.args["name"] + "です"
curl http://127.0.0.1:5000/get2x?name=yamada
yamadaです
####URLパラメーター
@app.get('/get2x/<name2>/myname')
def get2_myname(name2):
return f"{name2}です"
curl http://127.0.0.1:5000/get2x/tarou/myname
tarouです
####小まとめ
@app.get('/get2x/<name2>/myname')
def get2_myname(name2):
if "name" in request.args:
name = request.args["name"]
else:
name = "ななし"
return f"{name} {name2}です"
curl curl http://127.0.0.1:5000/get2x/tarou/myname?name=yamada
yamada tarouです
POST
@app.post('/post2x')
def post2x():
if "name" in request.form:
name = request.form["name"]
else:
name = "ななし"
if "name2" in request.form:
name2 = request.form["name2"]
else:
name2 = "ななし"
return f"{name} {name2}です"
'''
curl -X POST --data 'name=yamada&name2=tarou' http://127.0.0.1:5000/post2x
>
yamada tarouです
#### JSON取得
jsonで受け取ったデータをjsonで返す
#### importにjson追加
```Python:hoge.py
from flask import Flask, json, jsonify
@app.post('/post2x/json')
def post2x_json():
# bodyを文字列で取得
body = request.data.decode("UTF-8")
# jsonをdict型に変換
json_data = json.loads(body)
# 応答メッセージ追加
json_data["message"] = "ok"
return jsonify(json_data), 200
curl -X POST -H 'Content-Type: application/json' -d '{"name":"yamada", "name2":"tarou"}' http://127.0.0.1:5000/post2x/json
{"message":"ok","name":"yamada","name2":"tarou"}
エラー処理を入れてみる
@app.post('/post2x/json')
def post2x_json():
# headersにjsonが指定されていなかったらエラー
if "Content-Type" not in request.headers or request.headers["Content-Type"] != "application/json":
return jsonify({"message": "json形式ではありません"}), 500
try:
# bodyを文字列で取得
body = request.data.decode("UTF-8")
# jsonをdict型に変換
json_data = json.loads(body)
# 応答メッセージ追加
json_data["message"] = "ok"
return jsonify(json_data), 200
except Exception:
return jsonify({"message": "jsonの取得でエラーが発生しました"}), 500
curl -i -X POST -H 'Content-Type: application/json' http://127.0.0.1:5000/post2x/json
HTTP/1.0 500 INTERNAL SERVER ERROR
Content-Type: application/json
Content-Length: 103
Server: Werkzeug/2.0.1 Python/3.7.10
Date: Fri, 27 Aug 2021 05:58:25 GMT
{"message":"json\u306e\u53d6\u5f97\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f"}
まとめ
GET/POSTの使い方とパラメーターの値取得でしたが、PUT/DELETEでも基本は同じで行けると思う。
Flask2になってlaravelっぽい書き方が出来るようになったのかな
Flask1の書き方でもOKだし、この辺はあまり変わってなさそうだ
次回はBlueprintでもまとめてみようかな
今回のサンプルコードはGitHubにアップしております
github/flask2_demo