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

Я хочу получать данные, отправленные в мое приложение 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

Ответ на этот вопрос заставил меня спросить, как получить необработанное тело POST в Python Flask независимо от заголовка Content-Type, а именно: необработанные данные, а не проанализированные данные.


person ddinchev    schedule 03.05.2012    source источник


Ответы (19)


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

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

  • request.args: пары ключ / значение в строке запроса URL.
  • request.form: пары ключ / значение в теле из HTML-формы сообщения. , или запрос JavaScript, который не закодирован в JSON
  • 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 возвращает только первое значение.
person Robert    schedule 21.05.2013
comment
@ e-info128, вы должны импортировать объект request из колбы: from flask import request - person HackDolphin; 08.06.2021

Чтобы получить необработанные данные, используйте request.data. Это работает, только если он не может быть проанализирован как данные формы, иначе он будет пустым и request.form будет содержать проанализированные данные.

from flask import request
request.data
person clyfish    schedule 03.05.2012

Для параметров запроса 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')

Для JSON, отправленного с типом содержимого application/json, используйте request.get_json().

data = request.get_json()
person Fizer Khan    schedule 12.08.2014

Вот пример синтаксического анализа опубликованных данных JSON и их повторного вывода.

from flask import Flask, request, jsonify

app = Flask(__name__)

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

Чтобы опубликовать JSON с помощью curl:

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

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

Использование почтальона для отправки JSON

person Little Roys    schedule 16.11.2016

Чтобы получить необработанное тело сообщения независимо от типа содержимого, используйте request.get_data(). Если вы используете request.data, он вызывает request.get_data(parse_form_data=True), который заполнит request.form MultiDict и оставит data пустым.

person Xiao    schedule 14.08.2015

Если вы публикуете JSON с типом содержимого application/json, используйте request.get_json(), чтобы получить его во Flask. Если тип содержимого неверен, возвращается None. Если данные не JSON, возникает ошибка.

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

Чтобы получить request.form как обычный словарь, используйте request.form.to_dict(flat=False).

Чтобы вернуть данные JSON для API, передайте их jsonify.

В этом примере данные формы возвращаются в виде данных JSON.

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

Вот пример данных формы POST с curl, возвращаемых как JSON:

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

Используйте request.get_json(), чтобы получить опубликованные данные JSON.

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

Используйте request.form для получения данных при отправке формы с помощью метода POST.

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

Используйте request.args для получения данных, передаваемых в строке запроса URL-адреса, например, при отправке формы с помощью метода GET.

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

request.form и т. Д. Похожи на dict, используйте метод get, чтобы получить значение по умолчанию, если оно не было передано.

person Ravin Gupta    schedule 10.03.2019

Чтобы опубликовать JSON без типа содержимого application/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)
person Tarik Fojnica    schedule 25.03.2018

Чтобы опубликовать JSON с помощью jQuery в JavaScript, используйте JSON.stringify для выгрузки данных и установите тип содержимого 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()
person vaishali chaudhari    schedule 11.05.2018

Необработанные данные передаются в приложение Flask с сервера WSGI как request.stream. Длина потока указана в заголовке Content-Length.

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

Обычно безопаснее использовать вместо этого request.get_data().

person Daniel    schedule 11.07.2016

Для синтаксического анализа JSON используйте request.get_json().

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

Вот пример публикации данных формы для добавления пользователя в базу данных. Установите флажок request.method == "POST", чтобы проверить, была ли отправлена ​​форма. Используйте ключи от request.form, чтобы получить данные формы. В противном случае визуализируйте шаблон HTML с <form>. Поля в форме должны иметь 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>
person Dulangi_Kanchana    schedule 11.10.2019

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

person Paul Gowder    schedule 01.12.2018

При написании бота Slack, который должен отправлять данные JSON, я получил полезную нагрузку, где Content-Type было application/x-www-form-urlencoded.

Я попробовал request.get_json(), но ничего не вышло.

@app.route('/process_data', methods=['POST'])
def process_data():
   req_data = request.get_json(force=True)

Вместо этого я использовал request.form для получения поля данных формы, содержащего JSON, а затем загрузил его.

from flask import json

@ app.route('/slack/request_handler', methods=['POST'])
def request_handler():
   req_data = json.loads(request.form["payload"])
person Phoebe    schedule 24.09.2020

Если тип содержимого распознается как данные формы, request.data проанализирует это на request.form и вернет пустую строку.

Чтобы получить необработанные данные независимо от типа содержимого, вызовите request.get_data(). request.data вызывает get_data(parse_form_data=True), а значение по умолчанию - False, если вы вызываете его напрямую.

person Zavec    schedule 21.08.2018

При отправке данных формы с помощью 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.

person freezed    schedule 20.08.2018

Запрос на импорт:

from flask import request

Параметры URL-запроса:

name = request.args.get("name")
age = request.args.get("age")

Ввод формы:

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

ИЛИ (используйте индексирование, если вы знаете, что ключ существует, укажите имя поля ввода)

name = request.form['name']
age = request.form['age']

Данные JSON (для типа контента application / json)

data = request.get_json()
person Murad    schedule 09.05.2021

request.data

Это удобно использовать, но помните, что он поступает в виде строки и требует повторения.

person James McCannon    schedule 09.10.2020
comment
Уже много раз отвечал, к тому же перебирать строку не имеет смысла. - person Nebulastic; 09.10.2020