web-dev-qa-db-ja.com

Flask request.args vs request.form

私の理解では、request.args in FlaskにはGETリクエストからのURLエンコードされたパラメーターが含まれ、request.formにはPOSTデータが含まれます。 POSTリクエストを送信するときに、request.formを使用してデータにアクセスしようとすると400エラーを返しますが、request.argsを使用してアクセスしようとすると、それはうまくいくようです。

Postmancurlの両方でリクエストを送信しようとしましたが、結果は同じです。

curl -X POST -d {"name":"Joe"} http://127.0.0.1:8080/testpoint --header "Content-Type:application/json"

コード:

@app.route('/testpoint', methods = ['POST'])
def testpoint():
    name = request.args.get('name', '')
    return jsonify(name = name)
27
apardes

JSONをPOSTしている場合、_request.args_も_request.form_も機能しません。

_request.form_は、POST datawith the content content types;form dataは、 _application/x-www-form-urlencoded_または_multipart/form-data_ エンコーディングでPOSTされます。

_application/json_を使用すると、フォームデータをPOSTしなくなります。代わりに request.get_json() を使用してJSON POST dataにアクセスします。

_@app.route('/testpoint', methods = ['POST'])
def testpoint():
    name = request.get_json().get('name', '')
    return jsonify(name = name)
_

述べているように、_request.args_には、リクエストクエリ文字列に含まれる値(_?_疑問符の後のURLのオプション部分)のみが含まれます。 URLの一部であるため、POSTリクエストボディから独立しています。

41
Martijn Pieters

Curlのjsonデータが間違っているため、Flaskはデータを解析してフォームを作成しません。

次のようなデータを送信します:'{"name":"Joe"}'

curl -X POST -d '{"name":"Joe"}' http://example.com:8080/testpoint --header "Content-Type:application/json"
3
iurisilvio