web-dev-qa-db-ja.com

Flaskリクエストで受信したデータを取得する方法

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と尋ねるようになりました。これは、解析済みデータではなく生データを取得することです。

522
ddinchev

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.valuesargsformを組み合わせ、キーが重なる場合はargsを優先

これらはすべて MultiDict インスタンスです。値にアクセスするには、

  • request.form['name']:キーが存在することがわかっていればインデックスを使う
  • request.form.get('name'):キーが存在しないかもしれない場合はgetを使います
  • request.form.getlist('name'):キーが複数回送信され、値のリストが必要な場合はgetlistを使用してください。 getは最初の値のみを返します。
861
Robert
from flask import request
request.data
179
clyfish

以下の通りです

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)
146
Fizer Khan

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)

郵便配達員 を投稿依頼に使用します。

enter image description here

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の中の複数のパラメータ

67
Little Roys

FlaskにはJSONへのもう1つの近道があります。

ヘッダ:

{Content-Type: application/json}

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()
29
Amit Karnik

コンテンツタイプに関係なく生の投稿本文が必要な場合は、request.get_data()を使用する必要があります。これは、request.formwerkzeug.ImmutableMultiDictフォーマットに変換されるためです。

21
Xiao
@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)
9
Tarik Fojnica

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"
}

詳細はこちら 要旨

8
ivanleoncz

簡単に言えば、以下の方法でデータを取得できます。

@app.before_request
def before_request():
    g.data = request.get_json() or request.values

現在、g.datawerkzeug.ImmutableMultiDictのインスタンスです。そうすれば、ほとんどの要件を処理できるg.dataを使用できます。たとえば、これを次のように使用することができます。

@app.route("/something", methods=["POST"])
def do_something():
    result = handle(g.data)
    return jsonify(data=result)

もちろん、blueprint ~~の代わりにappを使うことができます。

8
zhangqy
length = request.headers["Content-Length"]
data=request.stream.read()

今、データは要求の本体です

6
Daniel

MIMEタイプが認識されると、request.datarequest.get_data()の両方が空の文字列を返します。

とにかく完全な内容を取得するには、request.get_data(as_text=True)を呼び出す必要があります。

http://flask.pocoo.org/docs/1.0/api/#flask.Request.get_data を参照してください。

4
Zavec

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()
2

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([])

2
freezed
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からパラメータを取得する

2
Ravin Gupta

これは、送信された方法に関係なくすべてのリクエストデータを取得するための一種の汚いハックですが、私は真剣に使用します。

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という文字列の呼び出しをスキップしてすべての辞書をマージします。それから、これはログに記録され、ビュー関数で返されます。どんなものであれ、実際にはリクエスト全体を見ることができます。

2
Paul Gowder