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



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



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




ответ на этот вопрос заставил меня спросить Get raw POST body в Python Flask независимо от заголовка Content-Type next, который касается получения необработанных данных, а не проанализированных данных.

684   14  

14 ответов:

The 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-запроса используйте запрос.аргументы

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)

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

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

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

:
{Content-Type: application/json}

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

Если вы хотите необработанное тело сообщения независимо от типа контента, вы должны использовать 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()

теперь данные-это тело запроса

используя 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})

Comments

    Ничего не найдено.