1070

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で生のPOST本体を取得するように求められました。これは、解析されたデータではなく生データを取得することです。

4

23 に答える 23

1893

ドキュメントでは、リクエスト中にrequestオブジェクト ( ) で使用できる属性について説明しています。フォールバックとして使用されるため、from flask import requestほとんどの場合は空になります。request.data

request.dataFlask が処理しない mimetype が含まれている場合に備えて、着信要求データを文字列として含みます。

  • request.args: URL クエリ文字列のキーと値のペア
  • request.form: 本文、HTML 投稿フォーム、または JSON エンコードされていない JavaScript リクエストからのキーと値のペア
  • request.files: 本体内のファイル。Flask はform. HTML フォームを使用する必要があります。使用しない場合enctype=multipart/form-data、ファイルはアップロードされません。
  • request.values: と を組み合わせargsて、キーが重なる場合formに優先args
  • 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最初の値のみを返します。
于 2013-05-21T07:25:07.400 に答える
257

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

from flask import request
request.data
于 2012-05-03T15:38:22.940 に答える
248

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')

コンテンツ タイプで投稿された JSONapplication/jsonの場合は、 を使用しますrequest.get_json()

data = request.get_json()
于 2014-08-12T15:22:24.467 に答える
146

投稿された 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 を投稿する

于 2016-11-16T03:55:33.723 に答える
57

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

于 2015-08-14T07:29:47.500 に答える
50

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

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()
于 2015-07-27T13:06:14.713 に答える
23

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ています。渡されなかった場合は、メソッドを使用してデフォルトの値を取得します。

于 2019-03-10T07:32:28.593 に答える
17

To post JSON with jQuery in JavaScript, use JSON.stringify to dump the data, and set the content type to 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");
    }   
});

Parse it in Flask with request.get_json().

data = request.get_json()
于 2018-05-11T13:58:21.030 に答える
15

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

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

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

于 2016-07-11T15:46:11.720 に答える
-1

私はちょうど同じ必要性に直面しました。不測の事態が発生した場合に備えて、情報を保存する必要があります。したがって、次の式を使用します。

Info = "%s/%s/%s" % (request.remote_addr, repr(request), repr(session))

repr(request) は、基本情報の文字列表現を提供します。request.headers.get('User-Agent') でユーザー エージェント データを追加できます。

貴重な情報が含まれている可能性があるため、セッション大陸も保存します

于 2021-12-27T13:10:56.113 に答える
-3
request.data

これは非常に便利ですが、文字列として入力されるため、反復処理が必要になることに注意してください。

于 2020-10-09T08:29:43.233 に答える