Flaskアプリに送信されたデータを取得できるようにしたいです。 request.data
にアクセスしようとしましたが、空の文字列です。リクエストデータにどのようにアクセスしますか?
@app.route('/', methods=['GET', 'POST'])
def parse_request():
data = request.data # data is empty
# need posted data here
この質問に対する答えから、Content-Typeヘッダに関係なく Python Flaskで/ - [生のPOSTボディを取得 nextと尋ねるようになりました。これは、解析済みデータではなく生データを取得することです。
docs はリクエストで利用可能な属性を記述します。ほとんどの場合、request.data
はフォールバックとして使用されるため空になります。
request.data
Flaskが処理できないMIMEタイプが付属している場合は、着信要求データを文字列として含みます。
request.args
:URLクエリ文字列内のキーと値のペアrequest.form
:ボディ内のキー/値ペア、HTML投稿フォーム、またはJSONエンコードされていないJavaScriptリクエストrequest.files
:本体内のファイル。Flaskはform
と区別します。 HTMLフォームではenctype=multipart/form-data
を使用する必要があります。そうしないとファイルがアップロードされません。request.values
:args
とform
を組み合わせ、キーが重なる場合はargs
を優先これらはすべて MultiDict
インスタンスです。値にアクセスするには、
request.form['name']
:キーが存在することがわかっていればインデックスを使うrequest.form.get('name')
:キーが存在しないかもしれない場合はget
を使いますrequest.form.getlist('name')
:キーが複数回送信され、値のリストが必要な場合はgetlist
を使用してください。 get
は最初の値のみを返します。from flask import request
request.data
以下の通りです
URLクエリパラメータ には request.args を使用
search = request.args.get("search")
page = request.args.get("page")
フォーム入力 の場合は、 request.form を使用します。
email = request.form.get('email')
password = request.form.get('password')
データ型application/json の場合は、 request.data を使用します。
# data in string format and you have to parse into dictionary
data = request.data
dataDict = json.loads(data)
application/json の完全な例を示します。
from flask import Flask, abort, request
import json
app = Flask(__name__)
@app.route('/foo', methods=['POST'])
def foo():
if not request.json:
abort(400)
print request.json
return json.dumps(request.json)
if __== '__main__':
app.run(Host='0.0.0.0', port=5000, debug=True)
郵便配達員 を投稿依頼に使用します。
curl commandを使用します。
curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo
P.S URLクエリパラメータの例については、あなたは私の答えを見ることができます Flask approuteの中の複数のパラメータ
FlaskにはJSONへのもう1つの近道があります。
ヘッダ:
{Content-Type: application/json}
@app.route("/something", methods=["POST"])
def do_something():
data = request.get_json()
コンテンツタイプに関係なく生の投稿本文が必要な場合は、request.get_data()
を使用する必要があります。これは、request.form
がwerkzeug.ImmutableMultiDict
フォーマットに変換されるためです。
@app.route('/', methods=['POST'])
def process_data():
req_data = request.get_json(force=True) # force=True will make sure this works even if a client does not specify application/json
language = req_data['language'] # or whatever key you have in your json
return '''The language value is: {}'''.format(language)
request.form
を使う.
単一のフォームデータ(request.form["field_name"]
)を取得する代わりに、次のようにrequest.form
オブジェクトによって提供されるImmutableDict
を解析することによって、投稿されたすべてのデータを取得できます。
フラスコ(ルート)
@app.route('/data', methods=['POST'])
def f_data():
if request.method == "POST":
fields = [k for k in request.form]
values = [request.form[k] for k in request.form]
data = dict(Zip(fields, values))
return jsonify(data)
シェル
$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
"name": "ivanleoncz",
"role": "Software Developer"
}
詳細はこちら 要旨 。
簡単に言えば、以下の方法でデータを取得できます。
@app.before_request
def before_request():
g.data = request.get_json() or request.values
現在、g.data
はwerkzeug.ImmutableMultiDict
のインスタンスです。そうすれば、ほとんどの要件を処理できるg.data
を使用できます。たとえば、これを次のように使用することができます。
@app.route("/something", methods=["POST"])
def do_something():
result = handle(g.data)
return jsonify(data=result)
もちろん、blueprint
~~の代わりにapp
を使うことができます。
length = request.headers["Content-Length"]
data=request.stream.read()
今、データは要求の本体です
MIMEタイプが認識されると、request.data
とrequest.get_data()
の両方が空の文字列を返します。
とにかく完全な内容を取得するには、request.get_data(as_text=True)
を呼び出す必要があります。
http://flask.pocoo.org/docs/1.0/api/#flask.Request.get_data を参照してください。
JavaScriptの場合:
var value_data = [1,2,3,4];
$.ajax({
type: 'POST',
url: '/',
data:JSON.stringify(value_data),
success: function (response) {
alert("Data added successfully");
},
});
Pythonでは:
client_data = request.get_data()
HTMLについて(少し)忘れてしまった私のような人たちのために、<input>
の<form>
にname=""
属性があることを確認してください。
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
print("Posted data : {}".format(request.form))
return """
<form method="post">
<input type="text">
<input type="text" id="idtxt2">
<input type="text" name="txt3" id="idtxt3">
<input type="submit" Value="Hopla!">
</form>
"""
if __== "__main__":
app.run()
コンソール上の結果:
freezed@machine % python3 run.py
* Serving Flask app "flaskstuff.views" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 268-634-781
127.0.0.1 - - [20/Aug/2018 16:52:59] "POST / HTTP/1.1" 200 -
Posted data : ImmutableMultiDict([('txt3', 'text 3')])
いいえ name属性 = データなし ImmutableMultiDict([])
!
from flask import request
content = request.get_json()
name = content.get('name', '')
リクエストタイプがjsonの場合はデータを取得し、それと一緒にデフォルトパラメータを指定することもできます。
from flask import request
content = request.form
name = content.get('name', '')
リクエストタイプフォームの場合はデータを取得
from flask import request
request.args.get("name", "")
gETリクエストでURLからパラメータを取得する
これは、送信された方法に関係なくすべてのリクエストデータを取得するための一種の汚いハックですが、私は真剣に使用します。
def get_request_info():
args = str(request.args)
form = str(request.form)
files = str(request.files)
maybe_json = request.get_json(silent=True, cache=False)
if maybe_json:
thejson = json.dumps(maybe_json)
else:
thejson = "no json"
return # whatever you want
それからこれらを連結した文字列を返すか、気になる場合は/ json dumpという文字列の呼び出しをスキップしてすべての辞書をマージします。それから、これはログに記録され、ビュー関数で返されます。どんなものであれ、実際にはリクエスト全体を見ることができます。