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


736

Flaskアプリにデータを送信できるようにしたいのですが。アクセスを試みましrequest.dataたが、空の文字列です。リクエストデータにどのようにアクセスしますか?

from flask import request

@app.route('/', methods=['GET', 'POST'])
def parse_request():
    data = request.data  # data is empty
    # need posted data here

この質問への答えにより、次にContent-Typeヘッダーに関係なく、Python FlaskでGet raw POST bodyを取得するようになりました。これは、解析されたデータではなく生データを取得することです。

回答:


1266

ドキュメントは、リクエストに応じて利用可能な属性を記述します。ほとんどの場合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:とを組み合わせたものargsformargsキーが重複する場合に優先します
  • request.json:解析されたJSONデータ。リクエストにはapplication/jsonコンテンツタイプrequest.get_json(force=True)を含めるか、コンテンツタイプを無視するために使用する必要があります。

これらはすべてMultiDictインスタンスです(を除くjson)。以下を使用して値にアクセスできます。

  • request.form['name']:キーが存在することがわかっている場合は、インデックスを使用します
  • request.form.get('name')getキーが存在しない可能性がある場合に使用します
  • request.form.getlist('name')getlistキーが複数回送信され、値のリストが必要な場合に使用します。get最初の値のみを返します。

204

生データを取得するには、を使用しますrequest.data。これは、フォームデータとして解析できなかった場合にのみ機能します。それ以外の場合は空になりrequest.form、解析されたデータが含まれます。

from flask import request
request.data

178

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で投稿されたJSONの場合は、を使用しますrequest.get_json()

data = request.get_json()

98

投稿されたJSONデータを解析してエコーバックする例を次に示します。

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/foo', methods=['POST']) 
def foo():
    data = request.json
    return jsonify(data)

curlでJSONを投稿するには:

curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo

またはPostmanを使用するには:

postmanを使用してJSONを投稿する


36

JSONをコンテンツタイプとともに投稿する場合は、Flaskで取得するためにapplication/json使用request.get_json()します。コンテンツタイプが正しくない場合は、Noneが返されます。データがJSONでない場合、エラーが発生します。

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

31

コンテンツタイプに関係なく生の投稿本文を取得するには、を使用しますrequest.get_data()。を使用するとrequest.data、が呼び出されrequest.get_data(parse_form_data=True)、が読み込まれ、空のrequest.form MultiDictままになりdataます。


18

request.form通常の辞書として取得するには、request.form.to_dict(flat=False)

APIのJSONデータを返すには、それをに渡しますjsonify

この例では、フォームデータをJSONデータとして返します。

@app.route('/form_to_json', methods=['POST'])
def form_to_json():
    data = request.form.to_dict(flat=False)
    return jsonify(data)

JSONとして返される、curlを含むPOSTフォームデータの例を次に示します。

$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
  "name": "ivanleoncz", 
  "role": "Software Developer"
}

12

request.get_json()投稿されたJSONデータを取得するために使用します。

data = request.get_json()
name = data.get('name', '')

request.formPOSTメソッドでフォームを送信するときにデータを取得するために使用します。

name = request.form.get('name', '')

request.argsGETメソッドでフォームを送信するときのように、URLのクエリ文字列で渡されるデータを取得するために使用します。

request.args.get("name", "")

request.formなどはdictに似getています。渡されなかった場合は、メソッドを使用してデフォルトの値を取得します。


10

application/jsonコンテンツタイプなしで投稿されたJSONを取得するには、を使用しますrequest.get_json(force=True)

@app.route('/process_data', methods=['POST'])
def process_data():
    req_data = request.get_json(force=True)
    language = req_data['language']
    return 'The language value is: {}'.format(language)

10

生データはWSGIサーバーからFlaskアプリケーションに渡されますrequest.stream。ストリームの長さはContent-Lengthヘッダーにあります。

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

通常はrequest.get_data()代わりに使用する方が安全です。


9

JavaScriptでjQueryを使用JSON.stringifyしてJSONを投稿するには、を使用してデータをダンプし、コンテンツタイプをに設定しapplication/jsonます。

var value_data = [1, 2, 3, 4];

$.ajax({
    type: 'POST',
    url: '/process',
    data: JSON.stringify(value_data),
    contentType: 'application/json',
    success: function (response_data) {
        alert("success");
    }   
});

でFlaskで解析しrequest.get_json()ます。

data = request.get_json()

8

JSONを解析するには、を使用しますrequest.get_json()

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

5

これは、ユーザーをデータベースに追加するためのフォームデータの投稿の例です。確認request.method == "POST"フォームが送信されたかどうかを確認します。キーを使用しrequest.formてフォームデータを取得します。<form>それ以外の場合はHTMLテンプレートをレンダリングします。フォームのフィールドにはname、のキーと一致する属性が必要request.formです。

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route("/user/add", methods=["GET", "POST"])
def add_user():
    if request.method == "POST":
        user = User(
            username=request.form["username"],
            email=request.form["email"],
        )
        db.session.add(user)
        db.session.commit()
        return redirect(url_for("index"))

    return render_template("add_user.html")
<form method="post">
    <label for="username">Username</label>
    <input type="text" name="username" id="username">
    <label for="email">Email</label>
    <input type="email" name="email" id="email">
    <input type="submit">
</form>

4

コンテンツタイプがフォームデータとして認識される場合、request.dataはそれを解析してrequest.form空の文字列を返します。

コンテンツタイプに関係なく生データを取得するには、を呼び出しますrequest.get_data()request.dataはを呼び出しget_data(parse_form_data=True)ますが、デフォルトはFalse直接呼び出す場合です。


4

本文がフォームデータとして認識された場合は、になりますrequest.form。JSONの場合はになりますrequest.get_json()。それ以外の場合、生データはにありrequest.dataます。データの送信方法がわからない場合は、orチェーンを使用して、データを含む最初のチェーンを取得できます。

def get_request_data():
    return (
        request.args
        or request.form
        or request.get_json(force=True, silent=True)
        or request.data
    )

request.args本文に何があるかに関係なく、クエリ文字列から解析された引数が含まれているので、本文と本文のget_request_data()両方が同時にデータを処理する必要がある場合は、その引数を削除します。


2

HTMLフォームを使用してフォームデータを投稿する場合は、inputタグにname属性があることを確認してください。属性がない場合、それらは属性に含まれませんrequest.form

@app.route('/', methods=['GET', 'POST'])
def index():
    print(request.form)
    return """
<form method="post">
    <input type="text">
    <input type="text" id="txt2">
    <input type="text" name="txt3" id="txt3">  
    <input type="submit">
</form>
"""
ImmutableMultiDict([('txt3', 'text 3')])

唯一のtxt3入力が持っていたnameので、それは唯一の重要な存在ですrequest.form

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.