Как получить данные, полученные в запросе Flask

Я хочу иметь возможность получать данные, отправленные в мое приложение колбы. Я пробовал получить доступ request.data но это пустая строка. Как получить доступ к данным запроса?

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

ответ на этот вопрос заставил меня спросить получить сырое тело сообщения в колбе Python независимо от заголовка типа контента далее, речь идет о получении необработанных данных, а не проанализированных данных.

14 ответов


на docs опишите атрибуты, доступные в запросе. В большинстве случаев request.data будет пустым, потому что он используется как запасной вариант:

request.data содержит данные входящего запроса в виде строки, если он поставляется с колбой mimetype, не обрабатывается.

  • request.args: пары ключ / значение в строке запроса URL
  • request.form: пары ключ / значение в теле, из формы HTML post или JavaScript запрос, который не JSON, закодированные
  • request.files: файлы в теле, которое фляга держит отдельно от 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 используйте запрос.args

search = request.args.get("search")
page = request.args.get("page")

на форма входа используйте запрос.форма

email = request.form.get('email')
password = request.form.get('password')

на тип данных application / json используйте запрос.данные

# 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 __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

использовать почтальон для запроса post:

enter image description here

использовать curl:

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

С. П. Для примера параметра запроса URL вы можете увидеть мой ответ в несколько параметров в колбе approute


Flask имеет еще один ярлык для JSON:

:
{Content-Type: application/json}

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

Если вы хотите, чтобы тело RAW post независимо от типа контента, вы должны использовать request.get_data(), потому что request.form превращается в .


проще говоря, вы можете получить данные как ниже:

@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~~


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

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

теперь data-это тело запроса


используя request.form.

вместо получения данных одной формы (request.form["field_name"]), вы можете получить все размещенные данные, проанализировав ImmutableDict предоставлен


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

Если тип mime распознается, то оба request.data и request.get_data() возвращает пустые строки.

чтобы получить полное содержимое независимо от того, вам нужно позвонить request.get_data(as_text=True).

см.http://flask.pocoo.org/docs/1.0/api/#flask.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 __name__ == "__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 Flask, request, jsonify

@app.route('/added', methods=['POST'])
def add():
    data = request.get_json(force=True)
    l = {'name': data['name']}
    lingual.append(l)

    return jsonify({'lang': lingual})