11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flask2でGET/POSTの値を取得する

Last updated at Posted at 2021-08-27

はじめに

前回の続きで、EC2上に構築したFlask2でGET/POSTの動作確認の防備録。
REST APIでは必須のJSONの連携もまとめていきます。

EC2にPython/Flask2を構築

GET

####Flask 1.*までの書き方
引数のmethodsを付けないとデフォルトはGETです

hoge.py
@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っぽい書き方?)

hoge.py
@app.get('/get2x')
def get2x():
  return "GET2です"

curlで動作確認

curl http://127.0.0.1:5000/get2x

GET2です

####パラメーター

hoge.py
@app.get('/get2x')
def get2x():
  return request.args["name"] + "です"
curl http://127.0.0.1:5000/get2x?name=yamada

yamadaです

####URLパラメーター

hoge.py
@app.get('/get2x/<name2>/myname')
def get2_myname(name2):
  return f"{name2}です"
curl http://127.0.0.1:5000/get2x/tarou/myname

tarouです

####小まとめ

hoge.py
@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

hoge.py
@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
hoge.py
@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"}

エラー処理を入れてみる

hoge.py
@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

11
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?