Help us understand the problem. What is going on with this article?

Flaskでpostされたデータをそのまま受け取る時はrequest.get_data()をつかう

ちょっとはハマったので、情報共有

環境

  • Flask 1.0.2
  • curl 7.54.0

結論

FlaskでPOSTされたデータをそのまま受け取るときはrequest.dataではなくrequest.get_data()を使う

理由

  • request.data : HTTPヘッダのContent-typeがハンドリングできないと値が格納されない。
  • request.get_data() : Content-typeの値にかかわらず値を取得できる。

実験

request.get_data()を使った場合

request.get_data()をそのまま返すサーバを立てる

from flask import Flask, request
app = Flask(__name__)
@app.route('/',methods=["POST"])
def hoge():
    return request.get_data()
app.run()

POSTのBODYに{"a":1}を指定してリクエスト

$ curl -X POST -d '{"a":1}'  http://127.0.0.1:5000/
{"a":1} 
# ↑POSTしたデータが帰ってくる

POSTしたデータが帰ってくるため、上手く動いている。

request.dataを使った場合

request.dataをそのまま返すサーバを立てる

from flask import Flask, request
app = Flask(__name__)
@app.route('/',methods=["POST"])
def hoge():
    return request.data
app.run()

POSTのBODYに{"a":1}を指定してリクエスト

$ curl -X POST -d '{"a":1}'  http://127.0.0.1:5000/

# 何も返ってこない

POSTしたデータが返ってこない。

理由はcurlのデフォルトのContent-typeがapplication/x-www-form-urlencodedであり、これがFalskがハンドリングできる値ではないため。

なので、curlに明示的にContent-type: application/jsonを指定すれば、

$ curl -X POST -H "Content-type: application/json"  -d '{"a":1}'  http://127.0.0.1:5000/
{"a":1}
# ↑POSTしたデータが返ってくる

マニュアルにも書いてある

https://werkzeug.palletsprojects.com/en/0.15.x/wrappers/#werkzeug.wrappers.BaseRequest.data

Contains the incoming request data as string in case it came with a mimetype Werkzeug does not handle.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした